188.买卖股票的最佳时机IV
题目描述: 188.买卖股票的最佳时机IV.
解法
dp
class Solution(object):
def maxProfit(self, k, prices):
dp = [[0] * (2*k+1) for _ in range(len(prices))]
# 0表示没有,j奇数表示买了j//2+1次,j为偶数表示卖了j//2次
for j in range(1,2*k+1,2):
dp[0][j] = -prices[0]
for i in range(1,len(prices)):
for j in range(1,2*k+1):
if j % 2 == 1:
dp[i][j] = max(dp[i-1][j],dp[i-1][j-1]-prices[i])
else:
dp[i][j] = max(dp[i-1][j],dp[i-1][j-1]+prices[i])
return dp[len(prices)-1][2*k]
思路其实和上一题是一样的,奇数和偶数状态都有规律。
309.最佳买卖股票时机含冷冻期
题目描述: 309.最佳买卖股票时机含冷冻期.
解法
dp
class Solution(object):
def maxProfit(self, prices):
# 有还是没有
# 有:0之前就有,今天才有
# 没有:1可购买期,2今天卖了,3冷冻期
dp = [[0]*5 for _ in range(len(prices))]
dp[0][0] = -prices[0]
for i in range(1,len(prices)):
dp[i][0] = max(dp[i-1][0],dp[i-1][1]-prices[i],dp[i-1][3]-prices[i])
dp[i][1] = max(dp[i-1][1],dp[i-1][3])
dp[i][2] = dp[i-1][0]+prices[i]
dp[i][3] = dp[i-1][2]
return max(dp[len(prices)-1][1],dp[len(prices)-1][2],dp[len(prices)-1][3])
买股票的问题,还是要基于当前的状态去考虑,有还是没有,有的话是怎么来的,没有的话又是怎么来的。
714.买卖股票的最佳时机含手续费
题目描述: 714.买卖股票的最佳时机含手续费.
解法
dp
class Solution(object):
def maxProfit(self, prices, fee):
#0没股票,1有股票
dp = [[0] * 2 for _ in range(len(prices))]
dp[0][1] = 0-prices[0]-fee
for i in range(1,len(prices)):
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]-fee)
return dp[len(prices)-1][0]
没什么难度