188.买卖股票的最佳时机IV
本题是123.买卖股票的最佳时机III 的进阶版
视频讲解:动态规划来决定最佳时机,至多可以买卖K次!| LeetCode:188.买卖股票最佳时机4_哔哩哔哩_bilibili
class Solution {
public:
int maxProfit(int k, vector<int>& prices) {
vector<vector<int>>dp(prices.size(),vector<int>(k*2+1,0));
for (int i=1;i<=k*2;i+=2)dp[0][i]=-prices[0];
for (int i=1;i<prices.size();i++){
for (int j=1;j<=k*2;j+=2)dp[i][j]=max(dp[i-1][j-1]-prices[i],dp[i-1][j]);
for (int j=2;j<=k*2;j+=2)dp[i][j]=max(dp[i-1][j-1]+prices[i],dp[i-1][j]);
}
return dp[prices.size()-1][k*2];
}
};
309.最佳买卖股票时机含冷冻期
本题加了一个冷冻期,状态就多了,有点难度,大家要把各个状态分清,思路才能清晰
视频讲解:动态规划来决定最佳时机,这次有冷冻期!| LeetCode:309.买卖股票的最佳时机含冷冻期_哔哩哔哩_bilibili
class Solution {
public:
int maxProfit(vector<int>& prices) {
//0表示未买入,1表示买入,2表示冷冻期
vector<vector<int>>dp(prices.size(),vector<int>(3,0));
dp[0][1]=-prices[0];
for (int i=1;i<prices.size();i++){
dp[i][0]=max(dp[i-1][0],dp[i-1][2]);
dp[i][1]=max(dp[i-1][0]-prices[i],dp[i-1][1]);
dp[i][2]=dp[i-1][1]+prices[i];
}
return max(dp[prices.size()-1][0],dp[prices.size()-1][2]);
}
};
714.买卖股票的最佳时机含手续费
相对122.买卖股票的最佳时机II ,本题只需要在计算卖出操作的时候减去手续费就可以了,代码几乎是一样的,可以尝试自己做一做。
视频讲解:动态规划来决定最佳时机,这次含手续费!| LeetCode:714.买卖股票的最佳时机含手续费_哔哩哔哩_bilibili
class Solution {
public:
int maxProfit(vector<int>& prices, int fee) {
vector<vector<int>>dp(prices.size(),vector<int>(2,0));
dp[0][1]=-prices[0];
for (int i=1;i<prices.size();i++){
dp[i][0]=max(dp[i-1][0],dp[i-1][1]-fee+prices[i]);
dp[i][1]=max(dp[i-1][1],dp[i-1][0]-prices[i]);
}
return max(dp[prices.size()-1][0],dp[prices.size()-1][1]);
}
};