用动态规划法解决长公共子序列问题.docVIP

  • 2
  • 0
  • 约3.44千字
  • 约 8页
  • 2019-10-08 发布于江苏
  • 举报

用动态规划法解决长公共子序列问题.doc

用动态规划法解决长公共子序列问题 PAGE PAGE 1 ———————————————————————————————— 作者: ———————————————————————————————— 日期: 动态规划解最长子序列 课程设计目的 掌握动态规划法的原理,并能够按其原理编程实现求两个序列数据的最长公共子系列,以加深对其的理解。 课程设计内容 1、用动态规划法解决最长子序列问题 2、交互输入两个序列数据 3、输出两个序列的最长公共子序列 概要设计 详细设计与实现 #include iostream.h #include iomanip.h #define max 100 void LCSLength(int m,int n,char *x,char *y,char *b) { int i,j,k; int c[max][max]; for(i=1;i=m;i++) { c[i][0]=0; } for(i=1;i=n;i++) { c[0][i]=0; } for(i=1;i=m;i++) { for(j=1;j=n;j++) { if(x[i-1]==y[j-1]) { c[i][j]=c[i-1][j-1]+1; k=i*(n+1)+j; b[k]=\\; } else if(c[i-1][j]=c[i][j-1]) { c[i][j]=c[i-1][j]; k=i*(n+1)+j; b[k]=|; } else{ c[i][j]=c[i][j-1]; k=i*(n+1)+j; b[k]=-; } } } } void LCS(int i,int j,char *x,char *b,int width) { if(i==0 || j==0) return; int k=i*(width+1)+j; if(b[k]==\\){ LCS(i-1,j-1,x,b,width); coutx[i]endl; } else if(b[k]==|) { LCS(i-1,j,x,b,width); } else { LCS(i,j-1,x,b,width); } } void main() { char x[max]={a,b,c,b,d,a,b}; char y[max]={b,d,c,a,b,a}; int m=7; int n=6; char b[max]={0}; LCSLength(m,n,x,y,b); LCS(m,n,x,b,n); coutendlendl; } 最长公共子序列问题具有最优子结构性质 设 X?=?{?x1?,?...?,?xm?} Y?=?{?y1?,?...?,?yn?} 及它们的最长子序列 Z?=?{?z1?,?...?,?zk?} 则 1、若?xm?=?yn?,?则?zk?=?xm?=?yn,且Z[k-1]?是?X[m-1]?和?Y[n-1]?的最长公共子序列 2、若?xm?!=?yn?,且?zk?!=?xm?,?则?Z?是?X[m-1]?和?Y?的最长公共子序列 3、若?xm?!=?yn?,?且?zk?!=?yn?,?则?Z?是?Y[n-1]?和?X?的最长公共子序列 由性质导出子问题的递归结构 当?i?=?0?,?j?=?0?时?,?c[i][j]?=?0 当?i?,?j??0?;?xi?=?yi?时?,?c[i][j]?=?c[i-1][j-1]?+?1 当?i?,?j??0?;?xi?!=?yi?时?,?c[i][j]?=?max?{?c[i][j-1]?,?c[i-1][j]?} #includeiostream.h #define max(a,b) ab?a:b #define M 100 void display(int n,int C,int w[M],int v[M]) { int i; cout请输入物品种数n:; cinn; couten

文档评论(0)

1亿VIP精品文档

相关文档