/*
dp(i,j)
j = 0: 手上没有股票,没有交易
j = 1: 手上买了一只股票
j = 2 : 手上无股票,卖了一只股票
j = 3 : 买了第二只股票
j = 4 : 手上无股票,卖了第二只股票
第一次交易有三种状态:
1, 不操作 dp(i, 0) = dp(i-1, 0)
2, 第一次买 dp(i,1) = max(dp(i-1,1), dp(i-1, 0) + price(i))
3, 第一次卖
当天操作或,当天没有操作
dp(i,2) = max(dp(i-1, 1) + price(i), dp(i-1,2))
股票第二次交易,有五种状态
1,2,3
4, 第二次购买
当天买/当天没有操作
dp(i,j) = dp(i-1,3)/ dp(i-1,2) - prices(i);
5, 第二次卖出
当天买/当天没有操作
dp(i-1,3) + prices(i), dp(i-1, 4);
*/
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 两次交易所能获得的最大收益
* @param prices int整型vector 股票每一天的价格
* @return int整型
*/
int maxProfit(vector<int>& prices) {
int len = prices.size();
if (len == 0 || len == 1) {
return 0;
}
vector<vector<int>> dp(len, vector<int>(5, 0));
dp[0][1] = -prices[0];
dp[0][3] = - prices[0];
for (int i = 1; i < len; i++) {
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[len-1][4];
// write code here
}
};