训练营打卡Day55
思路
- dp 数组表示在每个时刻有四种状态:0 代表买入,1 代表卖出,2 代表冷冻期,3 代表度过冷冻期。
- 在每个时刻,状态的转移由前一个时刻决定,从而通过求解 dp 数组的最后一个元素的最大值来求解最终的结果。
代码
class Solution {
public:
int maxProfit(vector<int>& prices) {
vector< vector<int> >dp(prices.size(), vector<int>(4, 0));
dp[0][0] = -prices[0];
for(int i = 1; i < prices.size(); i++)
{
dp[i][0] = max(dp[i-1][0], max(dp[i-1][2], dp[i-1][3]) - prices[i]);
dp[i][1] = dp[i-1][0] + prices[i];
dp[i][2] = dp[i-1][1];
dp[i][3] = max(dp[i-1][2], dp[i-1][3]);
}
return max(dp[prices.size()-1][1], max(dp[prices.size()-1][2], dp[prices.size()-1][3]));
}
};
思路
- dp数组用来存储交易过程中的最大收益。
- 第一维 i%2 表示当前天数,第二维 0 或 1 表示当前持有或不持有股票。初始化 dp[0][0] = -prices[0] 表示在第0天买入了股票。
- 在循环中,状态转移方程分别是:
- dp[i%2][0] = max(dp[(i-1)%2][0], dp[(i-1)%2][1] - prices[i]) 表示在第i天不持有股票的最大收益,可以从前一天不持有或前一天持有并卖出转移过来。
- dp[i%2][1] = max(dp[(i-1)%2][1], dp[(i-1)%2][0] + prices[i] - fee) 表示在第i天持有股票的最大收益,可以从前一天持有或前一天不持有并买入转移过来。
- 最后,return dp[(prices.size()-1)%2][1] 表示返回最后一天持有股票的最大收益。
代码
class Solution {
public:
int maxProfit(vector<int>& prices, int fee) {
vector< vector<int> >dp(2, vector<int>(2, 0));
dp[0][0] = -prices[0];
for(int i = 1 ; i < prices.size(); i++)
{
dp[i%2][0] = max(dp[(i-1)%2][0], dp[(i-1)%2][1] - prices[i]);
dp[i%2][1] = max(dp[(i-1)%2][1], dp[(i-1)%2][0] + prices[i] - fee);
}
return dp[(prices.size()-1)%2][1];
}
};
股票问题
- 只能买卖一次
- 可以买卖多次
- 最多买卖两次
- 最多买卖k次
- 买卖多次,卖出有一天冷冻期
- 买卖多次,每次有手续费