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