力扣 188. 买卖股票的最佳时机 IV python AC

动态规划

class Solution:
    def maxProfit(self, k, prices):
        size = len(prices)
        maxv = 0
        dp = [[[0] * (k + 1) for _ in range(2)] for _ in range(size)]
        dp[0][0][0] = 0
        dp[0][1][0] = -prices[0]
        for i in range(1, k + 1):
            dp[0][0][i] = dp[0][1][i] = -float('inf')
        for i in range(1, size):
            for j in range(k + 1):
                if j != 0:
                    dp[i][0][j] = max(dp[i - 1][0][j], dp[i - 1][1][j - 1] + prices[i])
                dp[i][1][j] = max(dp[i - 1][1][j], dp[i - 1][0][j] - prices[i])
                maxv = max(maxv, dp[i][0][j])
        return maxv

定义状态dp[i][j][k]表示在当前状态下能够得到的最大盈利

(i:第i天,j:当前是否持股(1是0否),k:当前已经卖出过几次股票)

--构建三维dp数组,初始化为0

--dp[0][1][0] = -prices[0](第0天持有股票已卖出0次的总盈利,即买第一天的股票花费price[0])

--dp[0][0][i], dp[0[[1][i](i>1) = -float('inf')(第0天只能卖出0次,其他状态都不可能)

--从1到size-1遍历i

  --从0到k遍历j

    --情况1:第i-1天持有股票,在第i天卖出,+第i天股票价格,此时卖出次数+1

      dp[i][0][j] 为 dp[i - 1][1][j - 1] + prices[i] 和 前一天相同状态 的较大值

    (注意此情况卖出次数至少为1 ,所以加入判断去除卖出后卖出次数还为0的情况)

    --情况2:第i-1天未持有股票,在第i天买入,-第i-1天股票价格,此时卖出次数不变

      dp[i][1][j] 为 dp[i - 1][0][j] - prices[i] 和 前一天相同状态 的较大值

    --记录当前轮次中不持有股票时能够盈利的最大值

  • 58
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值