只允许买卖一次
题目
思路分析
dp[]含义
1、dp[i][0]:第i天持有股票时最大的收益;
2、dp[i][1]:第i天不持有股票时最大的收益;
动态转移方程
1、dp[i][0]:第i天持有股票时最大的收益;
(1)情况1:前面已经买入,第i天不做任何操作,即dp[i][0] = dp[i-1][0];
(2)情况2:前面没有买入,第i天买入,即dp[i][0] = -prices[i];
==> dp[i][0] = max(dp[i-1][0]), 0-prices[i])
2、dp[i][1]:第i天不持有股票时最大的收益;
(1)情况1:前面没有买入,第i天也不买入,即dp[i][1] = dp[i-1][1];
(2)情况2:前面已经买入,第i天卖出,即dp[i][0] = dp[i-1][0] + prices[i];
==> dp[i][1] = max(dp[i-1][1]), dp[i-1][0] + prices[i]);
初始化
dp[0][0] = -prices[0];
dp[0][1] = 0;
代码实现
int maxProfit(vector<int>& prices) {
int n = prices.size();
vector<vector<int>> dp(n, vector<int>(2, 0));
dp[0][0] = 0 - prices[0];
dp[0][1] = 0;
for(int i = 1; i < n; ++i){
dp[i][0] = max(dp[i-1][0], 0 - prices[i]);
dp[i][1] = max(dp[i-1][1], dp[i-1][0] + prices[i]);
}
return dp[n-1][1];
}
允许买卖多次
题目
思路分析
dp[]含义
1、dp[i][0]:第i天持有股票时最大的收益;
2、dp[i][1]:第i天不持有股票时最大的收益;
动态转移方程
1、dp[i][0]:第i天持有股票时最大的收益;
(1)情况1:前面已经买入没有卖出,第i天不做任何操作,即dp[i][0] = dp[i-1][0];
(2)情况2:前面存在买入卖出,第i天买入,即dp[i][0] = dp[i-1][1]-prices[i];
==> dp[i][0] = max(dp[i-1][0]), dp[i-1][1]-prices[i])
2、dp[i][1]:第i天不持有股票时最大的收益;
(1)情况1:前面存在买入卖出,第i天也不买入,即dp[i][1] = dp[i-1][1];
(2)情况2:前面已经买入,第i天卖出,即dp[i][0] = dp[i-1][0] + prices[i];
==> dp[i][1] = max(dp[i-1][1]), dp[i-1][0] + prices[i]);
初始化
dp[0][0] = -prices[0];
dp[0][1] = 0;
代码实现
int maxProfit(vector<int>& prices) {
int n = prices.size();
vector<vector<int>> dp(n, vector<int>(2, 0));
dp[0][0] = 0 - prices[0];
dp[0][1] = 0;
for(int i = 1; i < n; ++i){
dp[i][0] = max(dp[i-1][0]