leetcode之Best Time to Buy and Sell Stock III 问题

来源:互联网 发布:17年机械行业数据 编辑:程序博客网 时间:2024/06/15 09:12

问题描述:

Say you have an array for which the ith element is the price of a given stock on dayi.

Design an algorithm to find the maximum profit. You may complete at mosttwo transactions.(发现这些问题变化了啥没?)

Note:
You may not engage in multiple transactions at the same time (ie, you must sell the stock before you buy again).

问题来源:Best Time to Buy and Sell Stock III (详细地址:https://leetcode.com/problems/best-time-to-buy-and-sell-stock-iii/#/description)

思路:和前面的两个问题Best Time to Buy and Sell Stock链接 和 Best Time to Buy and Sell StockII 链接 变化的只是交易的数量,所以说这类问题可以总结为一类问题,其实都是DP问题的变种。将这道题一般化,可以转化为进行k次交易的情况,然后我们这只需要将k特殊化(k = 2),说实话,我刚开始看到这道题知道是动态规划的问题,但是我也不知道如何进行递推,在这参考了一篇博客(参考博客),写的还是非常好的。

在这它采用了两个重要的数组,分别是local[]和global[]数组,表示局部最优和全局最优,有点极值和最值的意思了哈,下面我也把它对这两个数组的意思摘过来:

local[i][j]:截止到第i天,总共进行了j次交易的最大利润是多少,但是第i天正好进行了第j次交易才打到的最大利润;

global[i][j]:截止到第i天,总共进行了j次交易的最大利润是多少。

给出的递推公式,我在这也再补充解释一下:

                                                 local[i][j] = max(global[i  - 1][j - 1] + max(0, diff), local[i - 1][j] + diff);

根据咱们的定义出发,可以想到能出现两种情况,前面i - 1天进行的j - 1次交易加上这次的交易额不是正好凑够i天的j次交易嘛,当然这里考虑的第i天的第j次交易要是比0小,那我们就不采纳它了,直接加上一个0,所以才会出现max(0, diff)的情况了。最后取它们的最大值就满足题意的利益最大化了。

 相比较local[i][j]来讲,global[i][j]就要简单好理解很多了,因此,它的递推式子也容易得到了:

                                                 global[i][j] = max(global[i - 1][j], local[i][j])

在这也补充解释一下: i天总共进行了j次交易,它可以是前i - 1天就已经交易了j次了,也可以是直到进行了第i天的第j次 (前面i - 1天交易了j - 1次,就差最后一次交易了)才达到利润最大化。同样,必须取它们之间较大的那一个。

代码:


体会:自己还需要加强dp方面问题的分析能力,递推公式分析能力还是比较薄弱啊!多刷刷dp方面的问题,希望自己下次回头看的时候能够明白的更多吧,能有更深层次的理解吧,加油!


                                           

           




原创粉丝点击