算法学习之动态规划(一)

动态规划程序设计是对解最优化问题的一种途径、一种方法,最终问题的最优解可以通过前面子问题的最优解推导出来。
对于动态规划这个算法,自己学习的还不是很透彻,简单的总结自己学习的感受是:
1、动态规划思想中融合了递归和分治的思想,但不同于分治的是,动态规划求解中会通过状态记录求解过程中每一个分支的最优解法,以此节省了许多重复计算。
2、动态规划最重要同样也是最难的两步是找到描述子问题的状态以及状态间的推导关系。
3、比较可能使用动态规划的问题:求最大最小值、是否有可行方案以及可行方案个数。

先来一个最常见的题体验一下,求斐波那契数列(1,1,2,3,5,8,13...)某个位置的值?
应用分治法求解代码


Paste_Image.png

分治求解过程中,会有许多重复的运算,如下图3和2都被重复运算了两次,index值越大重复计算的次数就越多:


Paste_Image.png

ok,下面动态规划求解代码:
Paste_Image.png

我们定义了一个数组来记录斐波那契每个位置的值,这就相当于我们定义了一个状态;每个位置的值等于它前面两个的加和,这就相当于一个状态转移方程。

这里通过数组记录状态就是一种以空间换时间的思想,其实和我们平时开发用到的缓存的设计很像。

总结动态规划求解可以分为4步:
1、确定要解决的子问题,即状态的定义。
2、列出状态转移方程。
3、根据给定条件,初始化已知状态值。
4、求解最终问题解。

下面再来解一道比较有意思的问题,爬楼梯:
你正在爬楼梯,需要n步你才能到达顶部。但每次你只能爬一步或者两步,你能有多少种不同的方法爬到楼顶部?


Paste_Image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 动态规划学习-无资料 理论解释http://www.cnblogs.com/steven_oyj/archive/...
    RavenX阅读 4,640评论 0 2
  • 动态规划的关键点:最优化原理,也就是最优子结构性质。这指的是一个最优化策略具有这样的性质,无论过去状态和决策如何,...
    EboyWang阅读 5,359评论 0 6
  • 多阶段决策过程(multistep decision process)是指这样一类特殊的活动过程,过程可以按时间顺...
    碧影江白阅读 7,026评论 1 6
  • 从冬季再到冬季,整整就这样默默的喜欢了四个季度。直到今天才彻底明白,你的犹豫不决就是不喜欢我。你所说的喜欢我只是想...
    因吹死挺阅读 1,621评论 0 0
  • 叶落融于泥,人死散于风。 远方,在我们的认知里是一种模糊的存在。有一个远方,在我心中封存,就像封了许久的蜜酿,许久...
    红白Y阅读 3,523评论 2 3

友情链接更多精彩内容