代码随想录算法训练营第51天 | 309.最佳买卖股票时机含冷冻期, 714.买卖股票的最佳时机含手续费

309.最佳买卖股票时机含冷冻期

代码随想录链接

题目

LeetCode-309.最佳买卖股票时机含冷冻期

给定股票每天的价格, 要求卖出股票之后的第二天为冷冻期不能再次买入, 买卖次数不限制, 求能获得的最大利润.

题目分析

动态规划的重点是不同时刻之间状态的转移.

动态规划五部曲:

  • 确定dp数组及下标含义

    本题目的每一天总共有4种状态, 分别是不持有, 买入持有, 买入并当天卖出, 冷冻期.

    使用dp[i][0]代表不持有, dp[i][1]代表买入持有, dp[i][2]表示买入并在当天卖出, dp[i][3]为冷冻期.

  • 确定递推公式

    不持有的状态可以由冷静期或者不持有的状态得到, 有

    \[dp[i][0] = max(dp[i - 1][0], dp[i - 1][3])\]

    持有的状态可以由不持有状态和冷冻期状态买入股票得到, 或者保持持有状态得到, 有:

    \[dp[i][1] = max(max(dp[i - 1][0] - prices[i], dp[i - 1][3] - prices[i]), dp[i - 1][1])\]

    当天卖出的状态由前一天持有状态转化而来:

    \[dp[i][2] = dp[i - 1][1] + prices[i]\]

    冷冻期由前一天卖出的状态得到:

    \[dp[i][3] = dp[i - 1][2]\]

  • dp数组的初始化

    第一天的4种状态中只有买入持有的状态需要初始化为-prices[0], 其余均应该保持0;

  • 遍历顺序

    每一天的状态都由前一天的状态计算得来, 所以应当从前向后遍历

  • 举例推导

题解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Solution {
public:
int maxProfit(vector<int>& prices) {
vector<vector<int>> dp(prices.size(), vector<int>(4, 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][3]);
dp[i][1] = max(max(dp[i - 1][0] - prices[i], dp[i - 1][3] - prices[i]), dp[i - 1][1]);
dp[i][2] = dp[i - 1][1] + prices[i];
dp[i][3] = dp[i - 1][2];
}
return max(dp.back()[0], max(dp.back()[2], dp.back()[3]));
}
};

714.买卖股票的最佳时机含手续费

代码随想录链接

题目

LeetCode-714.买卖股票的最佳时机含手续费

同样是股票问题, 可以无限次交易但每次卖出都需要收取手续费.

题目分析

基本就是LeetCode-122.买卖股票的最佳时机II在卖出时多收了个手续费, 不再重复分析.

题解

1
2
3
4
5
6
7
8
9
10
11
12
class Solution {
public:
int maxProfit(vector<int>& prices, int fee) {
vector<vector<int>> dp(prices.size(), vector<int>(2, 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] - fee);
dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] - prices[i]);
}
return dp.back()[0];
}
};

股票问题总结

代码随想录链接

股票问题的关键点在于弄清楚每天都有几种状态, 以及状态与状态之间是怎么转换得到的.

代码随想录算法训练营第51天 | 309.最佳买卖股票时机含冷冻期, 714.买卖股票的最佳时机含手续费

http://wwg.xyz/algorithm-train-day51/

作者

Giles

发布于

2023-04-06

更新于

2023-04-06

许可协议

评论

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×