188.买卖股票的最佳时机IV
题目链接: 188. 买卖股票的最佳时机 IV - 力扣(LeetCode)
文章讲解: 代码随想录
思路:
类似于买卖股票的最佳时机三
用dp[i][2j+1]定义第i天第j次持有股票的最大现金
dp[i][2j+2]定义第i天第j次不持有股票的最大现金
转移:
dp[i][2j+1]第i天第j次持有,有两种情况 继续保持上一天的持有 或者上一天不持有,今天持有
上一天的持有dp[i-1][2j+1] ,上一天的不持有今天持有是 dp[i-1][2j]-prices[i] 两者求最大值
dp[i][2j+2]第i天第j次不持有 ,有两种情况 继续保持上一天的不持有 或者上一天持有,今天不持有
上一天的不持有dp[i-1][2j+2] 上一天持有,今天不持有 dp[i-1][2j+1]+prices[i]
遍历顺序 :正序遍历
cpp
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=0;i<prices.size();i++){
dp[i][0]=0;
}
for(int j=0;j<k;j++){
dp[0][2*j+1]=-prices[0];
dp[0][2*j+2]=0;
}
for(int i=1;i<prices.size();i++){
for(int j=0;j<k;j++){
dp[i][2*j+1]=max(dp[i-1][2*j+1],dp[i-1][2*j]-prices[i]);
dp[i][2*j+2]=max(dp[i-1][2*j+2],dp[i-1][2*j+1]+prices[i]);
}
}
return dp[prices.size()-1][2*k];
}
};
309.最佳买卖股票时机含冷冻期
题目链接:309. 买卖股票的最佳时机含冷冻期 - 力扣(LeetCode)
文章讲解:代码随想录
思路:
本题是在买卖股票2的基础上增加了一个冷冻期
原本是有两个状态
持有股票
不持有股票
那么可以对不持有股票进行拆分成 延续上一天的不持有
卖出 冷冻期
cpp
class Solution {
public:
int maxProfit(vector<int>& prices) {
vector<vector<int>>dp(prices.size(),vector<int>(4,0));
//dp[i][0] 持有股票
//dp[i][1] 卖出股票
//dp[i][2] 冷冻期
//dp[i][3] 延续卖出股票
dp[0][0]=-prices[0];
dp[0][1]=0;
dp[0][2]=0;
dp[0][3]=0;
for(int i=1;i<prices.size();i++){
int a=max(dp[i-1][0],dp[i-1][3]-prices[i]);
dp[i][0]=max(a,dp[i-1][2]-prices[i]);
dp[i][1]=dp[i-1][0]+prices[i];
dp[i][2]=dp[i-1][1];
dp[i][3]=max(dp[i-1][2],dp[i-1][3]);
}
int b=max(dp[prices.size()-1][1],dp[prices.size()-1][2]);
return max(b,dp[prices.size()-1][3]);
}
};
714.买卖股票的最佳时机含手续费
题目链接: 714. 买卖股票的最佳时机含手续费 - 力扣(LeetCode)
文章讲解: 代码随想录
思路:
与买卖股票2一样,多计算一个手续费用
cpp
class Solution {
public:
int maxProfit(vector<int>& prices, int fee) {
vector<vector<int>>dp(prices.size(),vector<int>(2,0));
//dp[i][0]不持有
//dp[i][1]持有
dp[0][0]=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]+prices[i]-fee));
dp[i][1]=max(dp[i-1][1],dp[i-1][0]-prices[i]);
}
return dp[prices.size()-1][0];
}
};