和上一题一样,注意一个情况即可,就是第0笔交易的情况,如果当前最多只有0笔交易,且未持有股票,那么继承的也是前一天0笔交易且未持有。
否则若持有,可能前一天就不持有,或者今天刚卖(因为卖了就有一笔交易了)
class Solution {
public:
int maxProfit(int k, vector<int>& prices) {
//k笔交易和2笔交易是一样的
//三维dp,第一维记录天数,第二维记录完成交易的次数,第三维记录当前是否持有股票
//所以这次第二维的内部要通过循环来处理
if(prices.size() <= 1) return 0;
vector<vector<vector<int>>> dp(prices.size(),vector<vector<int>>(k+1,vector<int>(2)));
//basecase:如果第一天持有就是-price[0],不持有就是0
for(int i = 0; i <=k; ++i){
dp[0][i][0] = 0;
dp[0][i][1] = -prices[0];
}
//状态转移:
for(int i = 1; i < prices.size(); ++i){
for(int j = 0; j <= k; ++j){
//如果当天是不持有的,可能前一天就不持有,或者今天刚卖
//但是要考虑第0笔交易的情况
if(j == 0){
dp[i][j][0] = dp[i-1][j][0];
}
else{
dp[i][j][0] = max(dp[i-1][j][0],dp[i-1][j-1][1]+prices[i]);
}
//如果当天是持有的,可能前一天就持有,或者今天刚买
dp[i][j][1] = max(dp[i-1][j][0]-prices[i],dp[i-1][j][1]);
}
}
return dp[prices.size()-1][k][0];
}
};