121 买卖股票的最佳时机
题目链接
思路
dp五部曲:
- dp数组含义:
dp[i][0]表示第i天不持有股票的最多现金,dp[i][1]表示第i天持有股票的最多现金 - 递推:
dp[i][0] = max(dp[i-1][0],dp[i-1][1] + price[i]);dp[i][1] = max(dp[i-1][1],-price[i])注意:只能买卖一次 - 初始化:
dp[0][0] = 0,dp[0][1] = -price[0] - 遍历方向:从左到右
- 模拟:

文章详解
cpp
class Solution {
public:
int maxProfit(vector<int>& prices) {
if(prices.size()== 0)
{
return 0;
}
vector<vector<int>> dp(prices.size(),vector<int>(2));
dp[0][0] = 0; dp[0][1] = -prices[0];
for(int i = 1; i < prices.size();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[prices.size() - 1][0];
}
};
122 买卖股票II
题目链接
思路
与上一道题相比,递推式发生变化:
·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]
文章详解
cpp
class Solution {
public:
int maxProfit(vector<int>& prices) {
// int result = 0;
// for(int i = 1; i < prices.size();i++)
// {
// result += max(prices[i]-prices[i-1],0);
// }
// return result;
if(prices.size()== 0)
{
return 0;
}
vector<vector<int>> dp(prices.size(),vector<int>(2));
dp[0][0] = 0; dp[0][1] = -prices[0];
for(int i = 1; i < prices.size();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[prices.size() - 1][0];
}
};
123 买卖股票III
题目链接
思路
需要再加一个维度k,表示当前操作位于第一周期还是第二周期。dp五部曲:
- dp数组含义:
dp[i][0][k]表示第i天不持有股票第k周期(k<2)的最大现金,dp[i][1][k]表示第i天持有股票第k周期(k<2)的最大现金 - 递推:
dp[i][0][0] = dp[i-1][0][0],dp[i][0][1] = max(dp[i-1][0][1],dp[i-1][1][0] + price[i]),dp[i][1][0] = max(dp[i-1][1][0],-prices[i]),dp[i][1][1] = max(dp[i-1][1][1],dp[i-1][0][1] - prices[i]),dp[i][0][2] = dp[i][1][1] + prices[i] - 初始化:dp[0][0][0] = 0,dp[0][1][0] = -prices[0], dp[0][0][1] = 0, dp[0][1][1] = -prices[0] dp[0][0][2] = 0
- 遍历顺序:从左到右
- 模拟递推:略
文章详解
cpp
class Solution {
public:
int maxProfit(vector<int>& prices) {
int n = prices.size();
if (n == 0) return 0;
vector<vector<vector<int>>> dp(n, vector<vector<int>>(2, vector<int>(3, 0)));
dp[0][0][0] = 0;
dp[0][1][0] = -prices[0];
dp[0][0][1] = 0;
dp[0][1][1] = -prices[0];
dp[0][0][2] = 0;
for (int i = 1; i < n; i++) {
dp[i][0][0] = dp[i - 1][0][0];
dp[i][1][0] = max(dp[i - 1][1][0], -prices[i]);
dp[i][0][1] = max(dp[i - 1][0][1], dp[i - 1][1][0] + prices[i]);
dp[i][1][1] = max(dp[i - 1][1][1], dp[i - 1][0][1] - prices[i]);
dp[i][0][2] = max(dp[i - 1][0][2], dp[i - 1][1][1] + prices[i]);
}
return dp[n - 1][0][2];
}
};