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;
}

你可能感兴趣的:(0x02 动态规划)