动态规划算法入门

认识事物的方法:概念、判断、推理,而推理又分为归纳、演绎。

数学归纳法
最简单和常见的数学归纳法是证明当 n 等于任意一个自然数时某命题成立。

证明分下面两步:

证明当 n = 1 时命题成立。

证明如果在 n = m 时命题成立,那么可以推导出在 n = m+1 时命题也成立。(m 代表任意自然数)

整个过程就像多米诺骨牌,只要前一个倒下,那么与其相邻的下一张骨牌也会倒。

第二数学归纳法
第二数学归纳法原理是设有一个与正整数 n 有关的命题,如果:

(1)当 n=1 时,命题成立;

(2)假设当 n≤k(k∈N)时,命题成立,由此可推得当 n=k+1 时,命题也成立。

那么根据①②可得,命题对于一切正整数 n 来说都成立。

上面两个的区别就在于对信息的使用上:

基本归纳法:对于 n ,只需考察前一个状态 n-1 即可完成整个推理过程,我们将这一模型称为马尔科夫模型;

高阶归纳法:相应的,对于 n, 考察前 n-1 个状态集 {1,2…n-1} 才可完成整个推理过程,往往称之为高阶马尔科夫模型;

在计算机算法中,高阶马尔科夫模型的推理,叫做 “动态规划”, 而马尔科夫模型的推理,对应 “贪心法”。

动态规划算法入门

一阶马尔科夫

动态规划算法入门

高阶马尔科夫

介绍完基本的一些概念后,我们给出解决数据结构和算法中一般套路:,3+1,3个诀窍1个原则。

算法求解可视化

当面对问题无头绪的时候,我们尝试着将自己的思路画出来,能有助于我们理清思路。

子问题拆解

计算机思维中一个很重要的就是通过模块化,将复杂问题拆解为一系列简单的问题。

打破假设

这是寻找到新解法的关键,我们需要突破假设,才能找到另一片天地。

还有最后一个原则就是类比,我们需要不断去总结现有的知识,然后将遇到的新东西都建立到我们现有的知识树上。

下面给出一个动态规划问题解决过程。

股票最大收益
问题描述:

给定数组 A[1,2…N],其中 A[i] 表示某股票第 i 天的价格,我们同时最多持有一股,如果只能进行一次买卖,如何利润最大化? 例如股票的变化是:1, 4, 9, 2, 7, 3

最好的方案是:1 买 9 卖,获利 8,如果一路下跌,则最好的方法是不进行交易。

我们第一步先将我们求解问题的过程画下来:

动态规划算法入门

通过画图我们就发现了子问题,就是去不断求解剩余天数只的获利最大值:

动态规划算法入门

下面我们加大难度,假设能够进行 k 次交易,但是规定买卖不能嵌套,即:买入后,要先卖出才可再买。

如:A=[7,1,5,3,6,4],K=3,则在 1,3 处买入, 5,6 处卖出,最大收益为 7。

我们还是先来将求解过程画图:

动态规划算法入门

从图中我们发现只是在之前子问题中加了个可再购买的变量,于是我们就有了下面的代码:

动态规划算法入门

总结
本文介绍了动态规划的由来,并且举了个例子来说如何解决动态规划问题,记住套路:3+1。

你的鼓励是我继续写下去的动力,期待我们共同进步。

动态规划算法入门

原文链接

https://www.toutiao.com/i6519641094077022724/?tt_from=android_share&timestamp=1517978272&app=news_article&iid=25495768163

服务推荐

相关文章: