三个序列的最长公共子序列 | |
|
问题描述
给定三个长度不超过200的整数序列X,Y,Z,求他们的最长公共子序列。序列中的数字均为10000以内的正整数。
例如:下列三个序列的最长公共子序列长度为4,为<1,3,9,15>。
X=<1,3,5,7,9,11,13,15>
Y=<0,1,3,6,9,12,15,18>
Z=<1,2,3,4,9,10,15,20>
输入格式
第一行,三个整数a,b,c分别代表x,y,z三个序列的长度
第二行,a个空格间隔的整数,表示x序列
第二行,b个空格间隔的整数,表示y序列
第二行,c个空格间隔的整数,表示z序列
输出格式
一个整数,表示所求答案
样例输入
8 8 8
1 3 5 7 9 11 13 15
0 1 3 6 9 12 15 18
1 2 3 4 9 10 15 20
样例输出
4
#include<bits/stdc++.h>
using namespace std;
int x[205],y[205],z[205],f[205][205][205];
int main(){
int m,n,s;
scanf("%d%d%d",&m,&n,&s);
for(int i=1;i<=m;i++) scanf("%d",&x[i]);
for(int i=1;i<=n;i++) scanf("%d",&y[i]);
for(int i=1;i<=s;i++) scanf("%d",&z[i]);
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
for(int k=1;k<=s;k++){
if(x[i]==y[j]&&y[j]==z[k]) f[i][j][k]=f[i-1][j-1][k-1]+1;
else f[i][j][k]=max(f[i-1][j][k],max(f[i][j-1][k],f[i][j][k-1]));
}
}
}
printf("%d",f[m][n][s]);
return 0;
}