【算法】4-动态规划

简介

动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法。20世纪50年代初美国数学家R.E.Bellman等人在研究多阶段决策过程(multistep decision process)的优化问题时,提出了著名的最优化原理(principle of optimality),把多阶段过程转化为一系列单阶段问题,利用各阶段之间的关系,逐个求解,创立了解决这类过程优化问题的新方法——动态规划。1957年出版了他的名著《Dynamic Programming》,这是该领域的第一本著作。

动态规划(dynamic programming)与分治方法相似,都是通过组合子问题的解来求解原问题(在这里,“programming”指的是一种表格法,并非编写计算机程序)。

分治方法将问题划分为互不相交的子问题,递归地求解子问题,再将它们的解组合起来,求出原问题的解。与之相反,动态规划应用于子问题重叠的情况,即不同的子问题具有公共的子子问题(子问题的求解是递归进行的,将其划分为更小的子子问题)。在这种情况下,分治算法会做许多不必要的工作,它会反复地求解那些公共子子问题。而动态规划对每个子子问题仅求解一次,并将其解保存于表格之中,从而无需每次求解相同子子问题时都要重新计算,避免了这种不必要的计算工作。

动态规划方法通常用于求解最优化问题(optimization problem)。这类问题可以有很多可行解,每个解都有一个值(我们称之为代价),我们希望寻找具有最优值(通常为最大值或者最小值)的解。我们称这样的解为问题的一个最优解(an optimal solution),而不是最优解(the optimal solution),因为有可能有多个解达到最优值。

使用条件

  • 优化子结构
    • 当一个问题的优化解包含了子问题的优化解释,我们说这个问题具有优化解结构。
  • 重叠子问题
    • 在问题的求解过程中,很多子问题的解将被多次使用

求解步骤

  1. 分析优化解的结构
  2. 递归地定义最优解的代价
  3. 递归地划分子问题,直至不可分
  4. 自底向上地求解各个子问题
    • 计算优化解的代价并保存
    • 获取最优解的信息
  5. 根据构造最优解的信息构造优化解

最优解的证明

反证法

具体问题

矩阵链乘

问题的定义

  • 输入: <A1,A2,… ,An>, Ai是pi-1×pi矩阵
  • 输出:计算 A1×A2×… ×An的最小代价方法

代价方程

i = j : m[ i , j ] = 0
i ≠ j : m[ i , j ] = mini≤k<j{m[ i , k ] + m[ k+1 , j] + pi-1pkpj}

最长公共子序列

问题的定义

  • 输入:X = (x1,x2,…xm), Y = (y1,y2,…yn)
  • 输出:X与Y的最长公共子序列Z = (z1,z2,…,zk)

代价方程

在这里插入图片描述

0/1背包问题

二叉搜索树

参考文献

[1]百度百科.动态规划[EB/OL].https://baike.baidu.com/item/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92/529408?fr=aladdin,2018-06-07.
[2]Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest,etc.算法导论[M].机械工业出版社:北京,2013:204-236.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值