日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

108. Leetcode 188. 买卖股票的最佳时机 IV (动态规划-股票交易)

發布時間:2025/4/5 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 (动态规划-股票交易)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。