您的位置:首页 > 其它

BNUOJ 4215 最长公共连续子序列

2014-07-10 14:54 176 查看

[b]最长公共连续子序列[/b]

Time Limit: 1000ms
Memory Limit: 65536KB

64-bit integer IO format: %lld Java class name: Main

给你两个序列S1和S2,长度分别是L1,L2 (1 <= L1 , L2 <= 180).

写一个程序找出最长的连续公共子序列。

连续子序列定义为序列中连续的一个片段。例如序列"1 2 3"的子串有空串,"1","2","3","1 2","2 3","1 2 3"。

Input

第1行:两个整数L1,L2,以一个空格隔开。

第2行到第L1+1行:每行一个整数,第i+1行给出S1中的第i个数。
第L1+2行到第L1+L2+1行:每行一个整数,第L1+i+1行给出S1中的第i个数。

Output

一个整数,给出S1和S2的最长连续子序列的长度

Sample Input

10 12
1
1
1
3
2
3
3
3
4
5
1
1
1
1
3
2
3
3
4
4
5
-8


Sample Output

7


Source

第八届北京师范大学程序设计竞赛热身赛第四场

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <vector>
#include <climits>
#include <algorithm>
#include <cmath>
#define LL long long
using namespace std;
int a[200],b[200],dp[200][200];
int main(){
int n,m,i,j,ans;
while(~scanf("%d %d",&n,&m)){
for(i = 1; i <= n; i++)
scanf("%d",a+i);
for(j = 1; j <= m; j++)
scanf("%d",b+j);
memset(dp,0,sizeof(dp));
for(ans = 0,i = 1; i <= n; i++){
for(j = 1; j <= m; j++){
if(a[i] == b[j]){
dp[i][j] = dp[i-1][j-1]+1;
}
if(dp[i][j] > ans) ans = dp[i][j];
}
}
printf("%d\n",ans);
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: