标签:
Description
Input
abcfbc abfcab programming contest abcd mnp
Output
4 2 0
Sample Input
abcfbc abfcab programming contest abcd mnp
Sample Output
4 2
0
题意:给你两组或多组子序列,现在让你求出他们的最大公共子序列的长度
分析:做这个提前我事先看了书知道这是个最大公共子序列问题,然后就根据书上给出的转移方程很顺利的就将此题AC了,解决本题的关键就是你要得到那个转移方程。
知识点:最大公共子序列问题。
心得:开数组的时候不能大意啊,一定要按题目给定的范围来定义
AC代码:
解法一:
#include <iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int d[1005][1005];
char a[1005],b[1005];
int max(int x,int y)
{
return x>y?x:y;
}
int main()
{
while(scanf("%s %s",a,b)!=EOF)
{
memset(d,0,sizeof(d));
int m=strlen(a);//数组长度
int n=strlen(b);
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
{
if(a[i-1]==b[j-1])
d[i][j]=d[i-1][j-1]+1;
else d[i][j]=max(d[i-1][j],d[i][j-1]);//最长公共子序列转移方程
}
printf("%d\n",d[m][n]);
}
return 0;
}
解法二:
#include<iostream>/*编译有问题,运行错误,提交用C++一直时格式错误,用G++一下就过了,好坑啊*/
#include<cstdio>
//#include<cstring>
using namespace std;
const int MAX=500;//数组开大会导致运行错误,没弄懂
int main()
{
string a,b;
int d[MAX][MAX];
while(cin>>a>>b)
{
int m=a.length();//数组长度
int n=b.length();
//memset(d,0,sizeof(d));
for(int i=1; i<=m; i++)
for(int j=1; j<=n; j++)
{
if(a[i-1]==b[j-1])
d[i][j]=d[i-1][j-1]+1;
else if(d[i-1][j]>d[i][j-1])
d[i][j]=d[i-1][j];
else d[i][j]=d[i][j-1];
}
cout<<d[m][n]<<endl;
}
return 0;
}
标签:
原文地址:http://www.cnblogs.com/lbyj/p/5758066.html