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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

买卖股票类问题动态规划解法(Leetcode题解-Python语言)

發(fā)布時(shí)間:2023/12/4 python 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 买卖股票类问题动态规划解法(Leetcode题解-Python语言) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在 Leetcode 中,關(guān)于買(mǎi)賣(mài)股票的問(wèn)題共有6道,而這些題目是可以用相同的思維進(jìn)行求解的,強(qiáng)烈推薦這篇總結(jié),寫(xiě)得非常到位。

股票類(lèi)問(wèn)題的動(dòng)態(tài)規(guī)劃分三步走,1、首先明確方程的含義

T[i][k][0]:表示在第 i 天結(jié)束時(shí),最多進(jìn)行 k 次交易且在進(jìn)行操作后持有 0 份股票的情況下可以獲得的最大收益;
T[i][k][1]:表示在第 i 天結(jié)束時(shí),最多進(jìn)行 k 次交易且在進(jìn)行操作后持有 1 份股票的情況下可以獲得的最大收益。

2、初始(基準(zhǔn))情況

T[-1][k][0] = 0, T[-1][k][1] = -Infinity T[i][0][0] = 0, T[i][0][1] = -Infinity

T[-1][k][0] = 0:交易開(kāi)始前沒(méi)有股票,收益為0;
T[-1][k][1] = -Infinity:交易開(kāi)始前有股票,這是不可能的,為負(fù)收益;
T[i][0][0] = 0:交易開(kāi)始了,不允許買(mǎi)股票也不持有股票,收益為0;
T[i][0][1] = -Infinity:交易開(kāi)始了,不允許買(mǎi)股票但是持有股票,這是不可能的,收益為0。

3、狀態(tài)轉(zhuǎn)移方程

T[i][k][0] = max(T[i - 1][k][0], T[i - 1][k][1] + prices[i]) T[i][k][1] = max(T[i - 1][k][1], T[i - 1][k - 1][0] - prices[i])

第一行:第 i 天沒(méi)有股票的最大收益,是上一天也沒(méi)有股票(掛機(jī))的收益和上一天有股票然后今天賣(mài)掉的收益,兩者中最大的。
第二行:第 i 天持有股票的最大收益,是上一天也持有股票(掛機(jī))的收益和上一天沒(méi)有股票然后今天買(mǎi)了股票的收益,兩者中最大的。注意允許交易的次數(shù) k 在買(mǎi)入時(shí)減去1

121. 買(mǎi)賣(mài)股票的最佳時(shí)機(jī)(劍指 Offer 63. 股票的最大利潤(rùn))

只能買(mǎi)賣(mài)一次股票,k = 1,狀態(tài)轉(zhuǎn)移方程為:

T[i][1][0] = max(T[i - 1][1][0], T[i - 1][1][1] + prices[i]) T[i][1][1] = max(T[i - 1][1][1], T[i - 1][0][0] - prices[i]) = max(T[i - 1][1][1], -prices[i]) class Solution:def maxProfit(self, prices: List[int]) -> int:n = len(prices)dp = [[0] * 2 for _ in range(n)]dp[0][0] = 0 dp[0][1] = -prices[0]for i in range(1, n):dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] + prices[i])dp[i][1] = max(dp[i - 1][1], -prices[i])return dp[n - 1][0]

122. 買(mǎi)賣(mài)股票的最佳時(shí)機(jī) II

可以無(wú)限次買(mǎi)賣(mài)股票,k 為正無(wú)窮,狀態(tài)轉(zhuǎn)移方程為:

T[i][k][0] = max(T[i - 1][k][0], T[i - 1][k][1] + prices[i]) T[i][k][1] = max(T[i - 1][k][1], T[i - 1][k - 1][0] - prices[i]) = max(T[i - 1][k][1], T[i - 1][k][0] - prices[i]) class Solution:def maxProfit(self, prices: List[int]) -> int:n = len(prices)dp = [[0] * 2 for _ in range(n)]dp[0][0] = 0 dp[0][1] = -prices[0]for i in range(1, n):dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] + prices[i])dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] - prices[i])return dp[n - 1][0]

123. 買(mǎi)賣(mài)股票的最佳時(shí)機(jī) III

最多買(mǎi)賣(mài)兩次股票,k = 2,狀態(tài)轉(zhuǎn)移方程為:

T[i][2][0] = max(T[i - 1][2][0], T[i - 1][2][1] + prices[i]) T[i][2][1] = max(T[i - 1][2][1], T[i - 1][1][0] - prices[i]) T[i][1][0] = max(T[i - 1][1][0], T[i - 1][1][1] + prices[i]) T[i][1][1] = max(T[i - 1][1][1], T[i - 1][0][0] - prices[i]) = max(T[i - 1][1][1], -prices[i]) class Solution:def maxProfit(self, prices: List[int]) -> int:n = len(prices)dp = [[[0] * 2 for _ in range(3)] for _ in range(n)]dp[0][1][0] = 0dp[0][1][1] = -prices[0]dp[0][2][0] = 0dp[0][2][1] = -prices[0]for i in range(1, n):dp[i][2][0] = max(dp[i - 1][2][0], dp[i - 1][2][1] + prices[i])dp[i][2][1] = max(dp[i - 1][2][1], dp[i - 1][1][0] - prices[i])dp[i][1][0] = max(dp[i - 1][1][0], dp[i - 1][1][1] + prices[i])dp[i][1][1] = max(dp[i - 1][1][1], dp[i - 1][0][0] - prices[i])return dp[n - 1][2][0]

188. 買(mǎi)賣(mài)股票的最佳時(shí)機(jī) IV

k 為給定的任意值,買(mǎi)賣(mài)要兩天時(shí)間,天數(shù) n 是有限的,所以實(shí)際上的 k 為 min(k, n // 2)。

class Solution:def maxProfit(self, k: int, prices: List[int]) -> int:if not prices:return 0n = len(prices)k = min(k, n // 2)dp = [[[0] * 2 for _ in range(k+1)] for _ in range(n)]for i in range(1, k+1):dp[0][i][0] = 0dp[0][i][1] = -prices[0]for i in range(1, n):for j in range(1, k+1):dp[i][j][0] = max(dp[i - 1][j][0], dp[i - 1][j][1] + prices[i])dp[i][j][1] = max(dp[i - 1][j][1], dp[i - 1][j - 1][0] - prices[i])return dp[n - 1][k][0]

309. 最佳買(mǎi)賣(mài)股票時(shí)機(jī)含冷凍期

k 實(shí)際上為正無(wú)窮,但是有冷凍期,如果要在第 i 天買(mǎi)入股票,第二個(gè)狀態(tài)轉(zhuǎn)移方程中就不能使用 T[i - 1][k][0],而應(yīng)該使用 T[i - 2][k][0],狀態(tài)轉(zhuǎn)移方程為:

T[i][k][0] = max(T[i - 1][k][0], T[i - 1][k][1] + prices[i]) T[i][k][1] = max(T[i - 1][k][1], T[i - 2][k][0] - prices[i]) class Solution:def maxProfit(self, prices: List[int]) -> int:n = len(prices)dp = [[0] * 2 for _ in range(n)]dp[0][0] = 0dp[0][1] = -prices[0]for i in range(1, n):dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] + prices[i])dp[i][1] = max(dp[i - 1][1], dp[i - 2][0] - prices[i])return dp[n - 1][0]

714. 買(mǎi)賣(mài)股票的最佳時(shí)機(jī)含手續(xù)費(fèi)

k 實(shí)際上為正無(wú)窮,但是有手續(xù)費(fèi),在買(mǎi)入(第一條方程)和賣(mài)出(第二條方程)中減去手續(xù)費(fèi)都是可以的,在買(mǎi)入時(shí)減去手續(xù)費(fèi)的狀態(tài)轉(zhuǎn)移方程為:

T[i][k][0] = max(T[i - 1][k][0], T[i - 1][k][1] + prices[i]) T[i][k][1] = max(T[i - 1][k][1], T[i - 1][k][0] - prices[i] - fee)

在賣(mài)出時(shí)減去手續(xù)費(fèi)的狀態(tài)轉(zhuǎn)移方程為:

T[i][k][0] = max(T[i - 1][k][0], T[i - 1][k][1] + prices[i] - fee) T[i][k][1] = max(T[i - 1][k][1], T[i - 1][k][0] - prices[i]) class Solution:def maxProfit(self, prices: List[int], fee: int) -> int:n = len(prices)dp = [[0] * 2 for _ in range(n)]dp[0][0] = 0 dp[0][1] = -prices[0]for i in range(1, n):dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] + prices[i] - fee)dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] - prices[i])return dp[n - 1][0]

總結(jié)

以上是生活随笔為你收集整理的买卖股票类问题动态规划解法(Leetcode题解-Python语言)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。