- 2
- 0
- 约3.44千字
- 约 8页
- 2019-10-08 发布于江苏
- 举报
用动态规划法解决长公共子序列问题
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)