动态规划
dp[i]表示第i天可以赚取的最大收益。
动态转移方程:dp[i] = max(dp[i-1],dp[i-1]+prices[i]-prices[i-1])。
初始值dp[0]表示初始收益为0。
class Solution {
public:
int maxProfit(vector<int>& prices) {
int n = prices.size();
vector<int> dp(n,0);
for(int i = 1; i < n; i++){
dp[i] = max(dp[i-1],dp[i-1]+prices[i]-prices[i-1]);
}
return dp[n-1];
}
};
时间复杂度O(n)
空间复杂度O(n)
其实只需用max_profit记录当前的最大收益值即可,空间复杂度可以变为O(1)。
通用版 二维动态规划
class Solution {
public:
int maxProfit(vector<int>& prices) {
int n = prices.size();
int dp[n][2]; //dp[i][j]表示第i天,持股状态为j时,拥有的最大现金数。
//dp[i][0]表示第i天买入后的现金数
//dp[i][1]表示第i天卖出后的现金数
//初始化
dp[0][0] = -prices[0];
dp[0][1] = 0; //因为没有所以不能卖
for(int i = 1; i < n; i++){
//必须在再次购买前出售掉之前的股票,所以需要交替计算
dp[i][0] = max(dp[i-1][1] - prices[i], dp[i-1][0]);
dp[i][1] = max(dp[i-1][0]+prices[i], dp[i-1][1]);
}
return dp[n-1][1];
}
};