代码随想录算法训练营第51天 | 309.最佳买卖股票时机含冷冻期, 714.买卖股票的最佳时机含手续费
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 |
|
714.买卖股票的最佳时机含手续费
题目
同样是股票问题, 可以无限次交易但每次卖出都需要收取手续费.
题目分析
基本就是LeetCode-122.买卖股票的最佳时机II在卖出时多收了个手续费, 不再重复分析.
题解
1 |
|
股票问题总结
股票问题的关键点在于弄清楚每天都有几种状态, 以及状态与状态之间是怎么转换得到的.
代码随想录算法训练营第51天 | 309.最佳买卖股票时机含冷冻期, 714.买卖股票的最佳时机含手续费