0x02 动态规划

采用动态规划发求解的问题必须具有两个性质:最优子结构和子问题重叠。
动态规划算法的基本要素
(1)最优子结构:当问题的最优解包含了其子问题的最优解时,称该问题具有最优子结构性质。
(2)重叠子问题:在用递归算法自顶向下解问题时,每次产生的子问题并不总是新问题,有些子问题被反复计算多次。这种性质称为子问题的重叠性质

与分治法相同,动态规划法具有最优子结构性质。动态规划法的解决办法,也是将一个大问题分解为若干个规模较小的子问题,通过合并求解的子问题而得到原问题的解。
与分治法不同,动态规划法的子问题重叠,指分解出的子问题不是相互独立的,有重叠部分。如果采用分治法求解,重叠的子问题将被重复计算多次。
动态规划法采用备忘录做法解决子问题重叠。对每个子问题只求解一次,保存每个子问题的计算结果,就像一个备忘录,当需要再次求解某个子问题是,只要查找备忘录中的结果即可,要求备忘录的查找时间为常数。


动态规划求解步骤:
(1)找出最优解的性质,并刻画其结构特征。
(2)递归地定义最优值(写出状态转移方程,或称动态规划方程)。
(3)以自底向上(或自顶向下)的方式计算出最优值。
(4)根据计算最优值时得到的信息,构造一个最优解。
f(n,m)=max{f(n-1,m), f(n-1,m-w[n])+P(n,m)}


动态规划算法基本框架代码

for(j=1; j<=m; j=j+1) // 第一个阶段
   xn[j] = 初始值;

 for(i=n-1; i>=1; i=i-1)// 其他n-1个阶段
   for(j=1; j>=f(i); j=j+1)//f(i)与i有关的表达式
     xi[j]=j=max(或min){g(xi-1[j1:j2]), ......, g(xi-1[jk:jk+1])};

t = g(x1[j1:j2]); // 由子问题的最优解求解整个问题的最优解的方案

print(x1[j1]);

for(i=2; i<=n-1; i=i+1)
{  
     t = t-xi-1[ji];

     for(j=1; j>=f(i); j=j+1)
        if(t=xi[ji])
             break;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 《算法导论》这门课的老师是黄刘生和张曙,两位都是老人家了,代课很慢很没有激情,不过这一章非常有意思。更多见:iii...
    mmmwhy阅读 5,298评论 5 31
  • 目录 动态规划与分治法 2.动态规划求解的最优化问题应该具备的两个要素2.1 最优子结构2.2 子问题重叠 动态规...
    王侦阅读 1,427评论 0 1
  • 动态规划学习-无资料 理论解释http://www.cnblogs.com/steven_oyj/archive/...
    RavenX阅读 1,036评论 0 2
  • 动态规划和贪心算法都是用来求最优化问题,且二者都必须具有最有子结构。贪心算法可以解决的问题,动态规划都能解决,可以...
    sereny阅读 6,656评论 0 7
  • 星期天,不算太忙,决定带着娃娃们去海通看荷花,上午把人聚集齐之后准备出发,刚走出家门,大姐说中午家里有客人,还要回...
    梁子LZ阅读 234评论 0 0