123.买卖股票的最佳时机III
题目链接:123. 买卖股票的最佳时机 III - 力扣(LeetCode)
题解:运用动态规划五部曲来解题
(1):确定dp数组以及下标含义
有以下五种股票持有情况
1.没有任何操作,即没有股票持有
2.第一次持有股票
3.第一次不持有股票
4.第二次持有股票
5.第二次不持有股票
dp[i][j]中表示第i天,j为[1 - 5]五个状态,dp[i][j]表示第i天状态为j所剩的最大现金
(注:这里所说的例如dp[i][1]表示的是并非是一定是在第一天去买股票
(2):确定递推公式
在上述当dp[i][1]出现时
一、第i天买入股票了,dp[i][1] = dp[i -1][0] - prices[i]
二、第i没有操作,dp[i ][1] = dp[i -1][1]
那么在这两种一定是选取最大的一个,即
dp[i - 1][j] = max(dp[i][1] = dp[i -1][0] - prices[i] , dp[i ][1] = dp[i -1][1])
根据以上递推过程可以推断dp[i -1] [2]也是如此
(3):dp数组如何初始化
第0天没有进行任何操作那么dp[0][0] = 0
第0天进行了第一次操作, dp[0][1] = -prices[0];
(4):确定遍历顺序
从前向后遍历
(5):举例dp数组
C++代码如下:
class Solution {
public:
int maxProfit(vector<int>& prices) {
if (prices.size() == 0) return 0;//创建一个函数,当值为0时就返回
vector<vector<int>> dp(prices.size(), vector<int>(5,0));
dp[0][1] = -perices[0];
dp[0][3] = -perices[0];//第0天所进行的操作
for (int i = 1; i < pricse.size(); i++) {
//遍历数组
dp[i][0] = dp[i - 1][0];//递推公式的推导
dp[i][1] = max(dp[ i -1][1],dp[i -1][0] - prices[i]);
dp[i][2] = max(dp[ i -1][2],dp[i -1][1] - prices[i]);
dp[i][3] = max(dp[ i -1][3],dp[i -1][2] - prices[i]);
dp[i][4] = max(dp[ i -1][4],dp[i -1][3] - prices[i]);
}
return dp[prices.size() - 1][4];
}
};