五分钟教你解决动态规划(leetcode股票问题)

375 阅读2分钟

今天带大家做动态规划的题目,我也是这两天稍微搞明白,特此写下来加深一下记忆。先举个leetcode例子。

一开始做这个题肯定什么思路也没有所以我先给大家讲方法,只要明白了这个方法,我相信动态规划题也就是信手捏来。

穷苦状态框架

顾名思义,我们要穷举每天的状态,以这个例子来说,每天我们都有三个操作,买入、卖出、保持,代表股票是否持有。然后乘以天数、再乘以交易次数也就是:持有状态X天数X交易次数。 用代码就是表示可以理解为

理解之后我们就可以用一个三位数组表视int[天数][交易次数][保持状态],举例子int[5][1][0]表示第五天,目前为止进行了一次交易,手中无股票,当然你自己可以选择买入交易次数+1,或者卖出+1。而我们的目的就是求最后天,最大交易次数也就是int[prices.length][k][0]。理解之后我们就可以用这个三维数组存储全部的状态。

状态转移

很简单,每天的状态都换转移,卖了买,买了卖就是这个意思。举个例子,今天是第五天,假如我第四天没有股票,那我今天要么买,要么继续保持也就是还是没有股票,从而选择最大利益,反之第四天持有股票的情况也很好理解。

用代码表示就是这个意思。如果看到这里,你全明白了的话,那恭喜你,leetcode这几题你就已经全部攻克,因为其他的只是类似的变种。不明白,我们继续解这个题目。

题目说了只能进行一次交易,k就可以省略。所以我们创建一个二维数组int[prices.length][2]。然后套一下状态框架。考虑一下基本情况以防止异常,答案就出来了。

仔细思考一下其实就两个变量,可以再次简化一下

哈哈哈,我们题目就这样做出来了,但如果一开始就给你这个答案,你肯定跟我一样,有点摸不到头脑,如果改成变量abcd,但立马就关掉页面了,因为一点都看不懂啊。但其实只有明白了这个内涵,就没那么恐怖了,还有特别感谢这几题的题解大佬。

谢谢大家。