摘要
本文主要介绍了LeetCode动态规划的几个题目,包括309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费,并在最后对股票问题进行了总结。
1、309.最佳买卖股票时机含冷冻期
1.1 思路
-
dp
数组以及下标的含义dp[0][i]
代表买入股票的最大金额dp[1][i]
代表卖出股票的最大金额dp[2][i]
代表冷冻期的最大金额
-
递推公式
dp[0][i] = Math.max(dp[0][i-1], dp[2][i-1] - prices[i])
dp[1][i] = Math.max(dp[1][i-1], dp[0][i-1] + prices[i])
dp[2][i] = dp[1][i-1]
-
dp
数组如何初始化dp[0][0] = - prices[i]
dp[1][0] = 0
dp[2][0] = 0
-
dp
数组遍历顺序- 从前向后遍历
-
打印
dp
数组- 以 [1,2,3,0,2] 为例,dp数组如下:
1.2 代码
public int maxProfit(int[] prices) {
int len = prices.length;
int[][] dp = new int[3][len];
dp[0][0] = -prices[0];
dp[1][0] = 0;
dp[2][0] = 0;
for(int i=1; i<len; i++) {
dp[0][i] = Math.max(dp[0][i-1], dp[2][i-1] - prices[i]);
dp[1][i] = Math.max(dp[1][i-1], dp[0][i-1] + prices[i]);
dp[2][i] = dp[1][i-1];
}
return dp[1][len-1];
}
2、714.买卖股票的最佳时机含手续费
2.1 思路
-
动规五部曲
-
dp
数组以及下标的含义dp[0][i]
持有股票的最大金额;dp[1][i]
不持有的最大金额;
-
递推公式
- 本题和动态规划:122.买卖股票的最佳时机II的区别就是这里需要多一个减去手续费的操作。
dp[0][i] = Math.max(dp[0][i-1], dp[1][i-1] - prices[i])
dp[1][i] = Math.max(dp[1][i-1], dp[0][i-1] + prices[i] - fee)
-
dp
数组如何初始化dp[0][0] = -prices[0]
;
-
dp
数组遍历顺序- 从前向后遍历
-
打印
dp
数组
-
-
注意事项
-
dp
数组初始化- 持有:
dp[0][0] = -prices[0]
- 不持有:
dp[1][0] = 0
- 持有:
-
2.2 代码
public int maxProfit(int[] prices, int fee) {
int len = prices.length;
int[][] dp = new int[2][len];
dp[0][0] = -prices[0];
dp[1][0] = 0;
for(int i=1; i<len; i++) {
dp[0][i] = Math.max(dp[0][i-1], dp[1][i-1] - prices[i]);
dp[1][i] = Math.max(dp[1][i-1], dp[0][i-1] + prices[i] - fee);
}
return dp[1][len-1];
}
}