188.买卖股票的最佳时机IV
变成了最多可以买卖k只股票
class Solution {
public:
int maxProfit(int k, vector<int>& prices) {
vector<vector<int>> dp(prices.size(),vector<int>(2*k+1,0));
for(int i=1;i<2*k+1;i+=2){
dp[0][i]=-prices[0];
}
//初始化,第k次买卖股票且持有股票的收益
for(int i=1;i<prices.size();i++){
//第i天第k笔持有的股票可以是第i-1天第k笔持有的股票得来的
for(int j=1;j<2*k;j+=2){
dp[i][j]=max(dp[i-1][j],dp[i-1][j-1]-prices[i]);
//第i天第j笔持有的股票的状态下最大利润,j表示还有股票
dp[i][j+1]=max(dp[i-1][j+1],dp[i-1][j]+prices[i]);
//第i天第j笔持有股票卖掉后(j+1是每股派的时候)
}
}
int m=dp[prices.size()-1][2];
for(int i=4;i<2*k+1;i+=2){
m=max(m,dp[prices.size()-1][i]);
}
return m;
}
};
309.最佳买卖股票时机含冷冻期
本题总共对应三 4种状态:
1.持有股票.2持股交易当天3.冷冻期。4.卖出股票后,买下一只股票前
在之前的题中,234被放到了一起,但本题有冷冻期所以要分开
class Solution {
public:
int maxProfit(vector<int>& prices) {
vector<vector<int>> dp(prices.size(),vector<int> (4,0));
dp[0][0]=-prices[0];
for(int i=1;i<prices.size();i++){
dp[i][0]=max(max(dp[i-1][0],dp[i-1][2]-prices[i]),dp[i-1][3]-prices[i]);
// 第i天持股,可以前一天是持股的,也可以前一天冷冻期,也可以前一天是冷冻期后但还没买入。
dp[i][1]=prices[i]+dp[i-1][0];//卖出股票当天,前一天必须持股
dp[i][2]=dp[i-1][1];//冷冻期,和前一天卖出去的一样
dp[i][3]=max(dp[i-1][3],dp[i-1][2]);//冷冻期结束后的一天或i-1天已经是结束冷冻期了
}
return max(max(dp[prices.size()-1][1],dp[prices.size()-1][2]),dp[prices.size()-1][3]);
}
};
714.买卖股票的最佳时机含手续费
dp[i][0]=max(dp[i-1][0],dp[i-1][1]+prices[i]-fee);
dp[i][1]=max(dp[i-1][1],dp[i-1][0]-prices[i]);
只用考虑减去手续费即可。