309. 买卖股票的最佳时机含冷冻期 - 力扣(LeetCode)
这个题比起我们的买卖股票二来说多了一个冷冻期的说法,也就是我们卖出股票的第二天无法买入股票。
这样对我们而言,dp数组的含义,或者说dp数组中的状态显然就不能是简单的持有或者未持有股票了,事实上,我们不仅得多加一个冷冻期的状态,我们还得多加一个今天卖出股票的状态,因为我们的冷冻期必须是卖出股票的后一天。
综上所述,我们需要四个状态:0表示持有股票,1表示保持未持有股票(也就是已经度过冷冻期),2表示今天卖出股票,3表示冷冻期。
代码如下:
class Solution {
public:
int maxProfit(vector<int>& prices) {
int n=prices.size();
if(!n)return 0;
vector<vector<int>> dp(n+1,vector<int>(4,0));
dp[0][0]=-prices[0];
for(int i=1;i<n;++i){
dp[i][0]=max(dp[i-1][0],max(dp[i-1][1]-prices[i],dp[i-1][3]-prices[i]));
dp[i][1]=max(dp[i-1][1],dp[i-1][3]);
dp[i][2]=dp[i-1][0]+prices[i];
dp[i][3]=dp[i-1][2];
}
return max(dp[n-1][1],max(dp[n-1][2],dp[n-1][3]));
}
};
714. 买卖股票的最佳时机含手续费 - 力扣(LeetCode)
这个题的思路其实就是在我们的买卖股票的基础上添加一个基本的手续费,除此之外并没有不同。
代码如下:
class Solution {
public:
int maxProfit(vector<int>& prices, int fee) {
int n=prices.size();
if(n==0)return 0;
vector<vector<int>> dp(n+1,vector<int>(2,0));
dp[0][0]=-prices[0];
dp[0][1]=0;
for(int i=1;i<n;++i){
dp[i][0]=max(dp[i-1][0],dp[i-1][1]-prices[i]);
dp[i][1]=max(dp[i-1][1],dp[i-1][0]+prices[i]-fee);
}
return dp[n-1][1];
}
};
总结:
股票的问题也算是告一段落,其实不难看出,股票问题的主要变化点就在于dp数组的含义以及我们的递推公式,更准确地说是我们dp数组表示的状态差异。