思路:DP状态机
所谓的DP状态机,其实就是标定这个题目中的所有状态,然后进行转移而已。
这的状态有三个:
1.有票的时候;
2.没有票且处于冷冻期的时候;
3.没有票但不处于冷冻期的时候;
dp数组就用来表示在第i天的时候的最大利润。
我们开始分析,在还没开始股票的价格跌宕时,我们在第0天如果买了股票,那么我们这个时候的收益肯定是负的,也就是当前价格的-price[i]。因为并没有因为股票而赚钱,并且还买了股票。其他的时候利润都是0,这是初始值。
假设我们从第一天开始,我们在第一天的时候如果是状态1,那么这个dp的最大利润就是:max(我在第0天的时候就买了股票的最大利润,我第0天没有票且不处于冷冻期并且在当天买了股票)
如果是状态2,只有一种可能,那就是我在第0天的时候有的股票,在当天卖出去了,也就是:
dp[i-1][0]+prices[i]。
如果是状态3,那么就是:max(我在第0天的时候卖出去了票子(在我有票的情况下)即第0天的状态2,我有票但是没卖即第0天的状态3)
一直这样类推就行了。
注意:最后我们需要考虑最后一天,最后一天如果说我们是又买了股票,那根本就没有收益,没有意义;所以我我们需要比较的只有后面那两种状态哪个利润最大。
上代码:
class Solution {
public:
int maxProfit(vector<int>& prices) {
int n=prices.size();
vector<vector<int>>dp(n+1,vector<int>(3));
dp[0][0]=-prices[0];//持有票的时候
dp[0][1]=0;//没有票并且处于冷冻期
dp[0][2]=0;//没有票并且不处于冷冻期
for(int i=1;i<n;i++){
dp[i][0]=max(dp[i-1][0],dp[i-1][2]-prices[i]);
dp[i][1]=dp[i-1][0]+prices[i];
dp[i][2]=max(dp[i-1][1],dp[i-1][2]);
}
return max(dp[n-1][1],dp[n-1][2]);
}
};