代码随想录算法训练营第四十二天 |动态规划part09(股票问题完)

68 阅读2分钟

代码随想录算法训练营第四十二天 |动态规划part09

188 买卖股票的最佳时机 IV

image-20250120233936712.png

dp[i][2*j+1] = max(dp[i-1][2*j+1],dp[i-1][2*j] - prices[i])
dp[i][2*j+2] = max(dp[i-1][2*j+2],dp[i-1][2*j+1] + prices[i])

对上面两行做出解释,dp[i] [2*j+1]指的是第2 * j + 1 次拥有股票时的最大利润,

所以就等于其前一轮也拥有股票时的最大利润或者其前一次没有拥有股票,在这一次的时候购买了股票。

那么分别对应,dp[i-1] [2*j+1] 以及 dp[i-1] [2 * j] - prices[i]

下面这一行代码同理,不过就是把拥有改成没有拥有。

dp = [[0]*(2*k+1) for i in range(len(prices))]
dp[0][0] = 0
for i in range(k):
    dp[0][2*i+1] = -prices[0]
    dp[0][2*i+2] = 0
for i in range(1,len(prices)):
    dp[i][0] = dp[i-1][0]
    for j in range(k):
        dp[i][2*j+1] = max(dp[i-1][2*j+1],dp[i-1][2*j] - prices[i])
        dp[i][2*j+2] = max(dp[i-1][2*j+2],dp[i-1][2*j+1] + prices[i])
return dp[-1][2*k]

309 买卖股票的最佳时机含冷冻期

image-20250120233945097.png

注意:一定记住循环是从1开始!!!!!!

n = len(prices)
if n < 2:
    return 0
dp = [[0,0,0] for i in range(n)]
dp[0][0] = -prices[0] # # 持有股票的最大利润
dp[0][1] = 0 # 不持有股票,且处于冷冻期的最大利润
dp[0][2] = 0 # 不持有股票,不处于冷冻期的最大利润
for i in range(1,n):
    dp[i][0] = max(dp[i-1][0],dp[i-1][2]-prices[i])
    dp[i][1] = dp[i-1][0] + prices[i]
    dp[i][2] = max(dp[i-1][2],dp[i-1][1])
return max(dp[-1][1],dp[-1][2])

思路就不进行详细解释了,相信再次复习的时候也可以看懂。

714 买卖股票的最佳时机含手续费

image-20250120233955966.png

和122 买卖股票的最佳时机II几乎一模一样,就是查了一个手续费

dp = [[0,0]  for i in range(len(prices))]
dp[0][0] = 0 # 没有的时候的最大值
dp[0][1] = -prices[0] # 有的时候的最大值
for i in range(1,len(prices)):
    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[-1][0]

image.png