309.最佳买卖股票时机含冷冻期
注意 冷冻期只为1天
达到买入股票状态(状态一)即:dp[i][0],有两个具体操作:
那么dp[i][0] = max(dp[i - 1][0], dp[i - 1][3] - prices[i], dp[i - 1][1] - prices[i]);
达到保持卖出股票状态(状态二)即:dp[i][1],有两个具体操作:
dp[i][1] = max(dp[i - 1][1], dp[i - 1][3]);
达到今天就卖出股票状态(状态三),即:dp[i][2] ,只有一个操作:
昨天一定是持有股票状态(状态一),今天卖出
即:dp[i][2] = dp[i - 1][0] + prices[i];
达到冷冻期状态(状态四),即:dp[i][3],只有一个操作:
昨天卖出了股票(状态三)
dp[i][3] = dp[i - 1][2];
- class Solution {
- public:
- int maxProfit(vector<int>& prices) {
- int n = prices.size();
- if (n == 0) return 0;
- vector
int>> dp(n, vector<int>(4, 0)); - dp[0][0] -= prices[0]; // 持股票
- for (int i = 1; i < n; i++) {
- dp[i][0] = max(dp[i - 1][0], max(dp[i - 1][3] - prices[i], dp[i - 1][1] - prices[i]));
- dp[i][1] = max(dp[i - 1][1], dp[i - 1][3]);
- dp[i][2] = dp[i - 1][0] + prices[i];
- dp[i][3] = dp[i - 1][2];
- }
- return max(dp[n - 1][3], max(dp[n - 1][1], dp[n - 1][2]));
- }
- };
714.买卖股票的最佳时机含手续费
dp[i][0] 表示第i天持有股票所省最多现金。 dp[i][1] 表示第i天不持有股票所得最多现金
如果第i天持有股票即dp[i][0], 那么可以由两个状态推出来
所以:dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] - prices[i]);
在来看看如果第i天不持有股票即dp[i][1]的情况, 依然可以由两个状态推出来
所以:dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i] - fee);
- class Solution {
- public:
- int maxProfit(vector<int>& prices, int fee) {
- int n = prices.size();
- vector
int>> dp(n, vector<int>(2, 0)); - dp[0][0] -= 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] - fee);
- }
- return max(dp[n - 1][0], dp[n - 1][1]);
- }
- };