动态规划
来源:互联网 发布:云之家网络平台 编辑:程序博客网 时间:2024/05/16 14:52
基本思想:
动态规划算法用来解决一些具有最优性质的问题,动态规划的思想和分治法相近,也是把一个问题分解为一些子问题去求解,但是动态规划处理的子问题之间会有联系。可以解决一些分治法和贪心算法解决不了的问题,其次动态规划可以提高程序运行效率避免了许多重复计算。所以下面我们给出几点动态规划的性质:
- 最优子结构性质:
无论之前状态结构如何,当前状态下得到的最优子结构一定是最优的。 - 无后向性:
以前各阶段的状态无法直接影响它未来的决策,而只能通过当前的这个状态。换句话说,每个状态都是过去历史的一个完整总结。 - 子问题重叠性:
使用动态规划算法过程中会保留每个状态的运行结果避免重复计算,即用空间换取时间。
算法实现:
下面我们使用一个动态规划中常用的例子——最长公共子序列来了解动态规划
算法步骤:
- 描述最优解的结构
- 递归定义最优解的值
- 按自底向上的方式计算最优解的值
- 由计算出的结果构造一个最优解
我们给出两条序列X:ABCBDAB和Y:BDCABA,我们要找到两个字符串中最长公共子序列,注意最长公共子序列是可以是不连续的,而最长公共子串是要完整的子串。下面给出求解公式:
i表示的是X中第i个位置,j表示的是Y中第j个位置,矩阵c[i,j]中存储当序列为x0,x1…xi和y0,y1…yj时的最长公共子序列的大小,下图给出求解过程:
首先将矩阵第0行和第0列初始化为0,从(1,1)位置开始逐行(逐列)计算。
如果此位置X和Y匹配,斜上方保存的是xi-1,yj-1状态的最优值,那么此位置保存的是上一状态的最优值加一。
如果此位置X和Y不匹配,此位置左侧存储的是xi,yj-1状态的最优值,上侧存储的是xi-1,yj状态的最优值,我们要取其中的最大值作为当前状态最优值。
图片中的箭头代表的是当前位置的最优值取自于哪个初始状态,当计算到最后我们按照箭头就可以得到相应的最优解对应的序列。
阅读全文
1 0
- 动态规划!!!动态规划!!!
- 动态规划
- 动态规划
- 动态规划
- 动态规划
- 动态规划
- 动态规划
- 动态规划
- 动态规划
- 动态规划
- 动态规划
- 动态规划
- 动态规划
- 动态规划
- 动态规划
- 动态规划
- 动态规划
- 动态规划
- 压缩感知中的lp球:p范数最优化为什么总会导致一个稀疏的解的原因
- 深入理解Spring MVC 思想
- Java 读写Properties配置文件
- 关于原型继承的三种方法
- -webkit-touch-callout禁止长按菜单
- 动态规划
- ANSYS Workbench的小技巧
- 利用pandas模块读取csv文件和excel表格,并用matplotlib画图
- lxml库 xpth使用
- poj2796 feel good 单调栈 前后延伸
- h5+ 总结
- C语言交换两个变量(不创建临时变量)(位运算简介)
- MySQL索引专题一 认识索引
- LVS工作原理的简单理解