题目
思路
显然采用DP,难点在于状态转移方程
每天最多只允许持有一支股票,即每天的状态只可能是持有一支股票或未持有,用DP[n][2]记录每天的最大利益,其中dp[i][0]表示第i天未持有股票的最大收益,dp[i][1]表示第i天持有股票的最大收益。
则有,未持有股票时,可能是i-1天就未持有,也可能是第i天卖出去了
持有股票时,可能是i-1天就持有了,也可能是第i天买的:
显然其边界为dp[0][0]=0,dp[0][1]=-prices[0]。
应该从小到大计算收益
代码
class Solution {
public:
int maxProfit(vector<int>& prices) {
int n = prices.size();
vector<vector<int>> dp(n,vector<int>(2));
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],dp[i-1][0]-prices[i]);
}
return dp[n-1][0];
}
};