Dynamic Programming

Chapter 3 Dynamic Programming I. 基本思想 聪明的遍历方法 为全遍历,不同于贪心算法的单一路径 关键:==自底向上== 寻找最优子结构: ==该问题的最优解包含着其子问题的最优解== 验证方法:反证法 建立递推关系 II. 矩阵连乘问题 最优解 == 以最少的数乘次数计算出矩阵连乘的乘积 引子想法:改进分治法 原本的分治法: 通过递归树,可以发现在递归中经常会重复计算: 思路是将重复计算的部分存储进二维数组之中,这种方法是基于分治法的改进方法 int LookupChain(int i,int j) { if (m[i][j] > 0) return m[i][j]; if (i == j) return 0; int u = LookupChain(i,i) + 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; } 动态规划法 动态规划先从最小的子问题开始计算,==自底向上==进行合并运算。这种方法不需要递归,而且也可以避免重复计算。 (1) 分析最优子结构 原问题的最优解可以由子问题的最优解解决,对于动态规划问题,首先需要证明该问题==满足最优子结构性质==(利用反证法) 矩阵连乘问题符合最优子结构的证明: 假设$A[i:j]=A[i:k]+A[k+1:j]$是最小的计算量,且有$A[i:m]+A[m+1:j] < A[i:k]+A[k+1:j]$,则可以发现原$A[i:j] < A[i:m]+A[m+1:j]$,此时不满足假设条件,矛盾!