第5章 动态规划(1).pptVIP

  • 7
  • 0
  • 约7.15千字
  • 约 31页
  • 2018-05-14 发布于四川
  • 举报
算法分析与设计 第3章 动态规划 算法总体思想 算法基本步骤 矩阵连乘问题 导弹拦截问题 最长公共子序列 0-1背包问题 算法总体思想 计算斐波那契数列 例2 Fibonacci数列 无穷数列0,1,1,2,3,5,8,13,21,34,55,…,被称为Fibonacci数列。它可以递归地定义为: 动态规划基本步骤 找出最优解的性质,并刻划其结构特征。 递归地定义最优值。 以自底向上的方式计算出最优值。 根据计算最优值时得到的信息,构造最优解。 矩阵连乘问题 矩阵连乘问题 矩阵连乘问题——分析最优子结构 特征:计算A[i:j]的最优次序所包含的计算矩阵子链 A[i:k]和A[k+1:j]的次序也是最优的。 矩阵连乘计算次序问题的最优解包含着其子问题的最优解。这种性质称为最优子结构性质。问题的最优子结构性质是该问题可用动态规划算法求解的显著特征。 矩阵连乘问题——建立递推关系 矩阵连乘问题——计算最优值 用动态规划法求最优解 矩阵连乘问题——构造最优解 void Traceback(int i,int j,int [][]s) { if(i==j)return; Traceback(i,s[i][j],s); Traceback(s[i][j]+1,j,s); cout“让 A”i; cout和 A(s[i][j]+1)相乘endl } 动态规划算法的基本要素 一、最优子结构 动态规划算法的基本要素 二、重叠子问题 动态规划算法的基本要素 三、备忘录方法 矩阵连乘的备忘录解决方法 m?0 private static int lookupChain(int i, int j) { if (m[i][j] 0) return m[i][j]; if (i == j) return 0; int u = lookupChain(i+1,j) + p[i-1]*p[i]*p[j]; s[i][j] = i; for (int k = i+1; k j; k++) { int t = lookupChain(i,k) + lookupChain(k+1,j) + p[i-1]*p[k]*p[j]; if (t u) { u = t; s[i][j] = k;} } m[i][j] = u; return u; } 0-1背包问题 0-1背包问题——求最优解 Void knapsack(int []v,int []w,int c,int [][]m) { int n=v.length-1; int jMax=math.min(w[n]-1,c); for(int j=0;j=jMax;j++) m[n][j]=0; for(int i=n-1;i1;i--){ jMax=math.min(w[i]-1,c) for(j=0;jjMax;j++) m[i][j]=max[i+1][j]; for(j=w[i];j=c;j++) m[i][j]=max(m[i+1][j],m[i+1][j-w[i]]+v[i]);} m[1][c]=m[2][c]; if(cw[1]) m[1][c]=max(m[1][c],m[2][c-w[1]]+v[1]); } 0-1背包问题——构造最优解 Void traceback(int [][]m,int[]w,int c,int []x) { int n=w.length-1; for(int i=1;in;i++) if(m[i][c]==m[i+1][c]) x[i]=0; else{x[i]=1;c=c-w[i];} x[n]=(m[n][c]0)?1:0; } 算法改进 典型例子(一) 算法改进 典型例子(二) 算法复杂度分析 导弹拦截问题 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统,但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够达到任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹袭击,由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。 输入导弹依次飞来的高度,计算这套系统最多能拦截多少导弹,并依次输出被拦截的导弹飞来时候的高度。 * * 动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题 n T(n/2) T(n/2) T(n/2) T(n/2) T(n) =

文档评论(0)

1亿VIP精品文档

相关文档