原题链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/
这类股票题目请见leetcode算法题–最佳买卖股票时机含冷冻期下面的参考链接,里面有全系列解法
动态规划:
dp[i][k][j] i表示第i天,k表示交易几次,j取0或1表示卖出或持有,dp表示花费
转移方程
dp[i][k][0]=max(dp[i-1][k][0],dp[i-1][k][1]+prices[i])
dp[i][k][1]=max(dp[i-1][k][1],dp[i-1][k-1][0]-prices[i])
这里k=1,所以公式有
dp[i][1][0]=max(dp[i-1][1][0],dp[i-1][1][1]+prices[i])
dp[i][1][1]=max(dp[i-1][1][1],dp[i-1][0][0]-prices[i])
dp[i-1][0][0]表示不能再交易,故为0。所以公式简化为
dp[i][1][0]=max(dp[i-1][1][0],dp[i-1][1][1]+prices[i])
dp[i][1][1]=max(dp[i-1][1][1],-prices[i])
再简化
dp[i][0]=max(dp[i-1][0],dp[i-1][1]+prices[i])
dp[i][1]=max(dp[i-1][1],-prices[i])
故代码:
int maxProfit(vector<int>& prices) {
int n=prices.size();
if(n==0) return 0;
vector<vector<int>> dp(n,vector<int>(2,0));
dp[0][0]=0;
dp[0][1]=-prices[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],-prices[i]);
}
return dp[n-1][0];
}