Leetcode 188. [Python]买卖股票的最佳时机 IV 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

Leetcode 188. 买卖股票的最佳时机 IV
给定一个整数数组 prices ,它的第 i 个元素 prices[i] 是一支给定的股票在第 i 天的价格。

设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。

注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

Code

def maxProfit(self, K: int, prices: List[int]) -> int:
    if prices is None or len(prices)==0:
        return 0
    n=len(prices)
    dp=[[0]*((2*K+1)+1) for _ in range(n+1)]
    if K>n//2:
        result=0
        for i in range(0,n-1,1):
            if prices[i+1] > prices[i]:
                result += (prices[i+1]-prices[i])
        return result       
    dp[0][1]=0
    for k in range(2,((2*K+1)+1),1):
        dp[0][k]=float('-inf')
    for i in range(1,n+1,1):
        for j in range(1,((2*K+1)+1),2):#1,3,5
            dp[i][j]=dp[i-1][j]#昨天没有持有今天还没有
            if j>1 and i>1 and dp[i-1][j-1] != float('-inf'):#昨天持有但今天卖出
                dp[i][j]=max(dp[i][j],dp[i-1][j-1]+prices[i-1]-prices[i-2])                
        for j in range(2,((2*K+1)+1),2):#2,4
            dp[i][j]=dp[i-1][j-1]#昨天未持有今天买入
            if i>1 and dp[i-1][j] != float('-inf'):#昨天持有并且今天依然持有
                dp[i][j]=max(dp[i][j],dp[i-1][j]+prices[i-1]-prices[i-2])
            if j>2 and i>1 and dp[i-1][j-2] != float('-inf'):#昨天持有今天卖出并买入
                dp[i][j]=max(dp[i][j],dp[i-1][j-2]+prices[i-1]-prices[i-2])
    res=float('-inf')
    for i in range(1,((2*K+1)+1),2):   
        res=max(res,dp[n][i])
                                                  
    return res

想法

1.dp[i][j]为前i天(第i-1天)结束后,处于阶段j,最大获利。
2.K交易次数,之所以K>n/2是由于,如果超过n/2的话,那么交易天数就有些会连起来。
3.在https://blog.csdn.net/vvv__vvv/article/details/110096694
中要求dp[i][1]dp[i][3]dp[i][5]
这里由于交易K次,所以要选择1,3,5,2K+1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值