NKOJ1052 最长公共子串
时间限制 : 1000 MS 空间限制 : 65536 KB
问题描述
有两个数字序列,序列X和序列Y,求这两个序列的最长公共子串。
输入格式
第一行,两个不超过500的整数,表示两个序列的长度。
接下来有两行,第一行有空格间隔的x个整数,表示序列x
第二行有空格间隔的y个整数,表示序列y (序列x,y中的整数大小不超过200)
输出格式
输出文件第一行为一个非负整数,表示所求得的最长公共子串长度
样例输入
5 7
1 5 3 2 3
2 3 5 3 2 5 3
样例输出
3
#include<cstdio>
using namespace std;
int a[502],b[502],m,n,ans[502][502],anss=-10e7;
int main()
{
scanf("%d%d",&m,&n);
for(int i=1;i<=m;i++) scanf("%d",&a[i]);
for(int i=1;i<=n;i++) scanf("%d",&b[i]);
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
{
if(a[i]==b[j]) ans[i][j]=ans[i-1][j-1]+1;
else ans[i][j]=0;
if(ans[i][j]>anss) anss=ans[i][j];
}
printf("%d",anss);
}
NKOJ1051 最长公共子序列
时间限制 : 1000 MS 空间限制 : 65536 KB
问题描述
有两个数字序列,序列X和序列Y,求这两个序列的最长公共子序列。
输入格式
第一行,两个不超过500的整数,表示两个序列的长度。
接下来有两行,第一行有空格间隔的x个整数,表示序列x
第二行有空格间隔的y个整数,表示序列y (序列x,y中的整数大小不超过200)
输出格式
输出文件第一行为一个非负整数,表示所求得的最长公共子序列长度
样例输入
7 6
15 10 7 10 3 15 10
10 3 7 15 10 15
样例输出
4
#include<cstdio>
#include<iostream>
using namespace std;
int m,n,mm[502],nn[502],f[502][502],ans=-10e7;
int main()
{
scanf("%d%d",&m,&n);
for(int i=1;i<=m;i++) scanf("%d",&mm[i]);
for(int j=1;j<=n;j++) scanf("%d",&nn[j]);
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
{
if(mm[i]==nn[j]) f[i][j]=f[i-1][j-1]+1;
else f[i][j]=max(f[i][j-1],f[i-1][j]);
}
printf("%d",f[m][n]);
}