188. 买卖股票的最佳时机 IV

给你一个整数数组 prices 和一个整数 k ,其中 prices[i] 是某支给定的股票在第 i 天的价格。

设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。也就是说,你最多可以买 k 次,卖 k 次。

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

示例 1:

输入:k = 2, prices = [2,4,1]
输出:2
解释:在第 1 天 (股票价格 = 2) 的时候买入,在第 2 天 (股票价格 = 4) 的时候卖出,这笔交易所能获得利润 = 4-2 = 2 。

示例 2:

输入:k = 2, prices = [3,2,6,5,0,3]
输出:7
解释:在第 2 天 (股票价格 = 2) 的时候买入,在第 3 天 (股票价格 = 6) 的时候卖出, 这笔交易所能获得利润 = 6-2 = 4 。
     随后,在第 5 天 (股票价格 = 0) 的时候买入,在第 6 天 (股票价格 = 3) 的时候卖出, 这笔交易所能获得利润 = 3-0 = 3 。

思路:123买卖股票的最佳时机Ⅲ

这道题是123那道题的抽象化,那道题是2次买卖股票,这道题抽象成k次买卖,若k=2,那不就是那道题了嘛。

因此核心思路完全一模一样。2次买卖我们设了4个状态分别表示第一次买入/卖出和第二次买入/卖出,那么这里k次买卖我们就相应的设2k个状态分别表示每次的买入和卖出。

然后递推公式,前两次的状态我们分析的很透彻了,第三次也一样,第四次......第k次也一模一样呀,只不过我们不能像上一道题一样每个状态列出来,我们得用个循环,把状态写进去。

然后是初始化了,也没什么区别,我们要初始化dp[0][0~2k-1],首先第0天不管第几次买入,都是-prices[0],因为一开始还没卖出股票,压根没利润,初始金额为0;然后第0天不管第几次卖出,那就是相当于第0天买入又卖出,进行了k次,那不是一分钱没花一分钱没赚嘛,为0

指路123那道题的题解:123. 买卖股票的最佳时机 III-CSDN博客

代码(Python):

class Solution(object):
    def maxProfit(self, k, prices):
        dp = [[0]*(2*k) for _ in range(len(prices)+1)]
        for i in range(2*k):         #初始化,第0天不管第几次买入都是-prices[0],卖出都是0
            if i % 2 == 0:
                dp[0][i] = -prices[0]
            else:
                dp[0][i] = 0
        for i in range(1,len(prices)):
            for j in range(2*k):
                if j % 2 == 0:       #买入
                    if j == 0:       #第一次买入
                        dp[i][j] = max(dp[i-1][j],-prices[i])
                    else:            #后面几次买入
                        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-1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值