算法分析与设计-动态规划0

来源:互联网 发布:商品条码数据库下载 编辑:程序博客网 时间:2024/04/25 04:37

最近在学习北大屈婉玲老师的算法分析与设计课程。跟着老师的课堂上的讲解,然后自己编程实现了一下老师讲的例子。为了防止自己过后忘了,所以还是做一下笔记好。

动态规划

基本思想和使用条件

  • 分解子问题:整个问题的直接求解是比较复杂的,抽象的。动态规划把整个问题分解,进行多步决策,从小扩展,每一步决策都建立在之前的子问题决策上,最后扩展到原问题。
  • 定义优化函数:利用函数的极大(极小)值为依据。确定是否满足优化原则。
  • 列出递推方程和边界条件:根据问题的参数,初始化边界情况下的取值。然后列出随参数变化的递推方程。
  • 优化原则:一个最优决策序列的任何子序列本身一定也是相对于子序列的初始和结束状态的最优决策序列。

算法设计步骤

  • 确定输入输出:首先要明确问题的输入和输出。比如背包问题中输入为物品的重量int[n] weight 和物品的价值int[n] value,都是一维向量;背包载重int b,为整数。输出为最大的装载价值,可能还要求装载的情况。
  • 备忘录:备忘录是动态规划中必不可少的。通常为二维数组。比如背包问题中用V[i][j]来表示只取前i种物品,且重量不超过j是的最大装载价值。注意二维数组的大小是(n+1)x(b+1),第i个物品的下标是i-1而不是i。
  • 递推方程和边界条件:边界条件就是初始的取值。比如在背包问题中,初始值就是i=0(不装任何物品)和j=0(载重量为0)是V值都应该是0。知道了边界条件(初始值)和递推方程之后,使用for循环就能很容易地求得整个问题的最终解。
  • 构造解:如果问题要求我们输出中间情况,比如背包问题中最后放入背包中的物品情况时。可以用标记函数来记录物品放入的情况。通常也是用二维数组I[n+1][b+1]来记录。

相关问题

背包问题、最长公共子序列(LCS)、投资问题等。

0 0