108. Leetcode 188. 买卖股票的最佳时机 IV (动态规划-股票交易)
?
步驟一、確定狀態:
確定dp數組及下標含義
dp[i] 表示的是在第i天可以獲取的最大利潤,每天會有持有股票和不持有 股票兩種狀態,這個是第二維度,還是用0和1表示。 而對于每一種狀態, 這里還會有交易次數的記錄k次, 這個是第三維度。所以dp[天數][當前是 否持股][賣出的次數]
步驟二、推斷狀態方程:
未持有股票的狀態 dp[i][0][k]系列 如果k=0的話,那么還是dp[i][0][0]等于0,開始的狀態
如果k>0的話, 未持有表示要么延續之前的狀態,要么是當天賣了出去 延續之前的狀態, 即dp[i-1][0][k] 當天賣了出去,說明前一天是持有股票的, 即dp[i-1][1][k-1]+prices[i] 這里取最大就是 dp[i][0][k]=max(dp[i-1][0][k], dp[i-1][1][k-1]+prices[i])
持有股票的狀態dp[i][1][k]系列
如果k=0的話, 說明是第一次買入的狀態, 此時利潤要么是延續之前的,要么 是今天剛買的
延續之前的, 即dp[i-1][1][0]
今天剛買的, 即昨天是沒有股票的, dp[i-1][0][0]-prices[i]
所以這里取最大是dp[i][1][0] = max(dp[i-1][1][0], dp[i-1][0][0]-prices[i])
如果k>0,也是這個思路, dp[i][1][k-1] = max(dp[i-1][1][k-1], dp[i-1][0][k- 1]-prices[i])
同樣的,等于k取不到,因為這時候已經完成了K筆交易,不能再買了。 dp[i][1][k]=float("-inf")
步驟三、規定初始條件:
初始條件:
全局初始化為0, 然后第0天的所有狀態必須都初始化出來: dp[0][0][0] = 0: 開始啥也沒干, 利潤0;
dp[0][1][0] = -prices[0]: 第0天持有股票,且進行了0次 交易,這是第一次買入,利潤-prices[0]
步驟四、計算順序:
遍歷方式會是兩層循環了,首先會從1到len(prices)遍歷天, 然后再從1到k遍歷交易次數,正向遍歷
class Solution:def maxProfit(self, k: int, prices: List[int]) -> int:if len(prices) < 2 or k == 0:return 0# dp[天數][當前是否持股][賣出的次數]dp = [[[0 for _ in range(k+1)] for _ in range(2)] for _ in range(len(prices))]# 初始化dp[0][0][0], dp[0][1][0] = 0, -prices[0]for i in range(1, k):dp[0][0][i], dp[0][1][i] = float("-inf"), float("-inf") # 第一天完不成交易# 遍歷for i in range(1, len(prices)):for k in range(1, k+1):dp[i][0][k] = max(dp[i-1][0][k], dp[i-1][1][k-1] + prices[i])dp[i][1][k-1] = max(dp[i-1][1][k-1], dp[i-1][0][k-1] - prices[i])# 最后一天不持有股票的值return max(dp[-1][0])總結
以上是生活随笔為你收集整理的108. Leetcode 188. 买卖股票的最佳时机 IV (动态规划-股票交易)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 107. Leetcode 123. 买
- 下一篇: 109. Leetcode 309. 最