思路: dp[i][0]表示第i天结束,没有持有任何股票的最大利润,dp[i][1]表示第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-2][0]-prices[i]) 今天结束持有股票有两种情况,要么昨天就有,要么今天刚买(但是今天买有一个前提,就是昨天不能卖,故考虑i-2天的情况)
写代码的时候还是要注意一下边界条件的。
总结:买股票的题,基本都可以用动态规划来做。思路就是考虑第i天结束,是持有股票,还是不持有股票即可。
class Solution {
public:
int maxProfit(vector<int>& prices) {
int n=prices.size();
if(n==0||n==1) return 0;
int dp[n+3][2];
dp[0][0]=0,dp[0][1]=-prices[0];
dp[1][0]=max(dp[0][0],dp[0][1]+prices[1]);
dp[1][1]=max(dp[0][1],-prices[1]);
for(int i=2;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-2][0]-prices[i]);
}
return dp[n-1][0];
}
};