Re: [闲聊] 每日LeetCode

楼主: Rushia (みけねこ的鼻屎)   2022-12-23 16:06:46
※ 引述《pandix (面包屌)》之铭言:
: 309. Best Time to Buy and Sell Stock with Cooldown
: 给你股票每天的价钱,每天能买/卖/不动,问你最大收益是多少
: 手上只能拿一份股票,也就是买完不能再买,要等到卖掉才能执行下一次购买
: 卖完的隔天只能执行不动这个选项
: Example 1:
: Input: prices = [1,2,3,0,2]
: Output: 3
: Explanation: transactions = [buy, sell, cooldown, buy, sell]
: Example 2:
: Input: prices = [1]
: Output: 0
方法一 动态规划
思路:
1.我们可以把股票每天结算的状态分成三种:
当天结束时持有股票
当天结束时不持有股票
当天的前一天是股票冷却期
因为有三种状态所以我们需要一个大小为 [n][3] 的阵列。
(对于买入股票的收益表示为-prices[i])
2.每个状态的状态转移方程如下:
* 当日结束时持有股票用 dp[i][0] 表示
可能是“前日持有股票且今天不买不卖”或“前日不持有股票且未冷却,今天买入”
两者较大值,表示如下:
max(dp[i - 1][0], dp[i - 1][2] - prices[i]
* 当日结束时不持有股票用 dp[i][1] 表示
可能是“前日不持有股票且今天不买不卖”或“前日持有股票今天卖掉”两者较大值
dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i])
* 当天的前一天是股票冷却期的最大收益用 dp[i][2] 表示
可能是“前日也是冷却今天不买不卖”或“前日卖了股票的最大收益”两者较大值
dp[i][2] = max(dp[i - 1][2], dp[i - 1][1])
3.根据上面的状态转移,我们初始化 dp[0][0](第一天收益) 并完成 dp 的表格。
4.返回dp[n - 1][0](因为手中不留股票的时必定比留股票的收益还高)
Java Code:
作者: twosheep0603 (两羊)   2022-12-23 16:14:00
直觉是贪婪 看到DP我都吓尿了
作者: devilkool (对猫毛过敏的猫控)   2022-12-23 16:16:00
大师
作者: sustainer123 (caster)   2022-12-23 16:18:00
大师级
作者: pandix (面包屌)   2022-12-23 16:42:00
大师

Links booklink

Contact Us: admin [ a t ] ucptt.com