本题对于买卖股票加入了冷冻期的限制,因此设置dp数组分为四个状态:买入股票状态、卖出股票状态(两天前卖出股票或前一天卖出股票一直没有操作)、今天卖出股票状态、冷冻期状态。
具体代码如下:
cpp
class Solution {
public:
int maxProfit(vector<int>& prices) {
vector<vector<int>>dp(prices.size(),vector<int>(4,0));
//dp[0][0]持有股票
//dp[0][1]卖出股票状态
//dp[0][2]今天卖出股票
//dp[0][3]冷冻期
dp[0][0]=-prices[0];
for(int i=1;i<prices.size();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];
}
int m=prices.size()-1;
return max(dp[m][1],max(dp[m][2],dp[m][3]));
}
};
本题与求买卖股票最大利润的区别仅在于加入了手续费,因此在不持有股票状态的递推公式中减去手续费即可。
具体代码如下:
cpp
class Solution {
public:
int maxProfit(vector<int>& prices, int fee) {
vector<vector<int>>dp(prices.size(),vector<int>(2,0));
dp[0][0]=-prices[0];
dp[0][1]=0;
//dp[i][0]第i天持有股票
//dp[i][1]第i天不持有股票
for(int i=1;i<prices.size();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[prices.size()-1][1];
}
};