下载此文档

长公共子序列问题(00002).docx


文档分类:论文 | 页数:约7页 举报非法文档有奖
1/7
下载提示
  • 1.该资料是网友上传的,本站提供全文预览,预览什么样,下载就什么样。
  • 2.下载该文档所得收入归上传者、原创者。
  • 3.下载的文档,不会出现我们的网址水印。
1/7 下载此文档
文档列表 文档介绍
最长公共子序列问题:(递归与动态规划实现)

注:
(1)递归方法求最长公共子序列的长度
1)设有字符串a[0...n],b[0...m],下面就是递推公式。
             当数组a和b对应位置字符相同时,则直接求解下一个位置;当不同时取两种情况中的较大数值。
LCS(I,j)=1+LCS(i-1,j-1);( a[i]=b[j])
或者=MAX(LCS(I,j-1),LCS(i-1,j);(a[i]不等于b[j])
#include<iostream>
#include<cstdio>
#include<string>
#include<>
using namespace std;
string lcsstr;
#define N 30
int xlen,ylen;
int c[N][N];
int maxlen;
int LCS(char*x,char*y,string d,int i,int j,int len)
{
if(i<0||j<0)
{
if(len>maxlen)
{ maxlen=len;
lcsstr=d;
}
return 0;
}
xlen=strlen(x);
ylen=strlen(y);
if(x[i]==y[j])
{
d=x[i]+d;
return c[i][j]=LCS(x,y,d,i-1,j-1,len+1)+1;
}
else return LCS(x,y,d,i-1,j,len)>LCS(x,y,d,i,j-1,len)?LCS(x,y,d,i-1,j,len):LCS(x,y,d,i,j-1,len);
}
int main()
{
char s1[N];
char s2[N];
int i,j,num;
char*s=new char[N];
string d;
double t,tt;
cout<<"输º?入¨?第̨²一°?个?字Á?串ä?:"<<endl;
cin>>s1;
i=strlen(s1);
cout<<"输º?入¨?第̨²二t个?字Á?串ä?:êo"<<endl;
cin>>s2;
j=strlen(s2);
t=clock();
num= LCS(s1,s2,d,i-1,j-1,0);
tt=clock()-t;

cout<<num<<","<<lcsstr<<endl;
cout<<"运?行D时º¡À间?:êo"<<tt<<endl;
system("pause");
}
以下是用递归实现输出最长公共子序列的运行截图:
(2)动态规划:
(2)动态规划求最长公共子序列的长度
动态规划采用二维数组来标识中间计算结果,避免重复的计算来提高效率。
1)最长公共子序列的长度的动态规划方程
设有字符串a[0...n],b[0...m],下面就是递推公式。字符串a对应的是二维数组num的行,字符串b对应的是二维数组num的列。
#include<iostream>
#include<>
#include<strin

长公共子序列问题(00002) 来自淘豆网m.daumloan.com转载请标明出处.

相关文档 更多>>
非法内容举报中心
文档信息
  • 页数7
  • 收藏数0 收藏
  • 顶次数0
  • 上传人taotao0c
  • 文件大小536 KB
  • 时间2017-09-11