问题描述
有两个数字序列,序列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
/*
时间:4.30
状态:
f[i][j]表示x数组的前i个与y数组的前j个中最长公共子序列的长度
方程:1.当x[i] == y[j]:
f[i][j] = f[i - 1][j - 1] + 1
(f[i - 1][j - 1]表示x数组的前i - 1个与y - 1数组的前j个中最长公共子序列的长度
再加当前相同的x[i]与y[j]这一个)
其他:
f[i][j] = max(f[i][j - 1], f[i - 1][j])
(f[i][j - 1]表示x数组的前i个与y数组的前j - 1个中最长公共子序列的长度)
(f[i - 1][j]表示x数组的前i - 1个与y数组的前j个中最长公共子序列的长度)
(再选最大值)
边界:
(1) 1 <= i <= n
(2) 1 <= j <= m
问题:
1.注意数组大小
*/
#include <bits/stdc++.h>
using namespace std;
int x[500 + 5] = { };
int y[500 + 5] = { };
int f[500 + 5][500 + 5] = { };//1
int main()
{
int n, m;
scanf("%d %d", &n, &m);
for(int i = 1; i <= n; i++){
scanf("%d", &x[i]);
}
for(int i = 1; i <= m; i++){
scanf("%d", &y[i]);
}
for(int i = 1; i <= n; i++){
for(int j = 1; j <= m; j++){
if(x[i] == y[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[n][m]);
return 0;
}