第3章动态规划法..pptVIP

  • 9
  • 0
  • 约1.9万字
  • 约 56页
  • 2016-12-21 发布于重庆
  • 举报
算法设计与分析 * 最优三角剖分的递归结构 定义t[i][j], 1≤ij≤n, 为子多边形{vi–1, vi,…, vj}的最优三角剖分所对应的权函数值,并为方便起见,设退化的多边形{vi–1, vi}的权值为0。 于是凸(n+1)边形的最优三角剖分为t[1][n] 易知,t[i][j]可递归定义为 当i = j时,为退化多边形{vi–1, vi},t[i][j] = 0; 当i<j时,利用最优子结构性质有: t[i][j] = min{t[i][k] + t[k+1][j] + w(vi–1vkvj)} i≤k<j 与矩阵连乘积问题相对比: m[i][j] = min{m[i][k] + m[k+1][j] + pi–1pkpj} i≤k<j 显然,矩阵连乘积的最优计算顺序与凸多边形最优三角剖分具有完全相同的递归结构。 算法设计与分析 * 最优三角剖分的算法 由于凸多边形最优三角剖分与矩阵连乘积的最优计算顺序具有完全相同的递归结构,其区别仅在于权函数的不同,所以只需要修改求矩阵连乘积的最优计算顺序的算法中的权函数计算便可得到凸多边形最优三角剖分的算法。 显然该算法的时间复杂性也是O(n3)。 Void MinWeightTriangulation(int n, Type **t, int **s) { for (int i = 1; i = n; i++) t[i][i] = 0; for (int r = 2; r = n; r++) for (int i = 1; i = n – r +1; i++) { int j = i + r – 1; t[i][j] = t[i+1][j] + w(i–1, i, j); s[i][j] = i; for (int k = i + 1; k j; k++) { int u = t[i][k] + t[k+1][j] + w(i–1, k, j); if (u t[i][j]) {t[i][j] = u; s[i][j] = k;} }}} //程序中红色的部分为改动的地方 算法设计与分析 * 最长公共子序列 给定序列A=a1,a2,…,ak,...,an,B=b1,b2,…,bk,...,bm。如果存在A的子序列A1=ai1,ai2,…,air(i1i2…ir)和B的子序列B1=bj1,bj2,…,bjr(j1j2…jr),使得aik=bjk(k=1,2,..r),则称C=A1=B1为序列A、B的一个公共子序列。 A,B的长度最大公共子序列称为A,B的最长公共子序列。 例如:A=a,b,c,b,d,a,c,b,B=b,d,c,a,b,C1=b,a,b是A、B的一个公共子序列,但不是最长子序列。C2=b,d,a,b和C3=b,c,a,b都是A、B的最长子序列。 注意:这里的子序列对于原序列而言不一定是连续的。 算法设计与分析 * 求最长公共子序列 对A=a1,a2,…,ak,...,an,B=b1,b2,…,bk,...,bm 求序列A、B的最长公共子序列的最直接方法是对A的所有子序列逐个检查是否为B的子序列,并且在检查过程中记录最长子序列。 A的每个子序列对应下标集{1,2,...n}的一个子集,因此遍历所有A的不同子序列要求的时间复杂性为O(2n)。 显然这不是一个有效的方法。 算法设计与分析 * 最长公共子序列性质 对长度为n的序列S=s1,s2,…,sk,...,sn,记Sr= s1,s2,…,sr (r=n,Sn=S)。 如果C=c1,c2,…,cr是A、B的一个最长公共子序列,则C必为如下三种情况之一: 1) 如果an=bm,则cr= an=bm ,即Cr-1是An-1和Bm-1的最长公共子序列; 2) 如果an≠bm且cr ≠an,则C是An-1和B的最长公共子序列; 3) 如果an≠bm且cr ≠bm,则C是A和Bm-1的最长公共子序列; 即两个序列的最长公共子序列包含了这两个序列前缀的最长公共子序列。 算法设计与分析 * 最长公共子序列的递归结构 以LCS(A,B)表示序列A、B的最长公共子序列,求LCS(A,B)的递归结构如下: Φ表示空,||表示在子序列尾部添加一个元素。 计算A、B的最长公共子序列可能要求计算A、Bm-1的公共最长子序列或者An-1、B的公共最长子序列,而这两个子问题又都包含求An-1、Bm-1的公共最长子序列。 以len(i,j)表示LCS(Ai,Bj)的长度有: 算法设计与分析 * 求最长公共子串长度的算法 int LCSle

文档评论(0)

1亿VIP精品文档

相关文档