题目:P1439 【模板】最长公共子序列
题目描述
给出 1 , 2 , … , n 1,2,\ldots,n 1,2,…,n 的两个排列 P 1 P_1 P1 和 P 2 P_2 P2 ,求它们的最长公共子序列。
输入格式
第一行是一个数 n n n。
接下来两行,每行为 n n n 个数,为自然数 1 , 2 , … , n 1,2,\ldots,n 1,2,…,n 的一个排列。
输出格式
一个数,即最长公共子序列的长度。
输入输出样例 #1
输入 #1
5
3 2 1 4 5
1 2 3 4 5
输出 #1
3
说明/提示
- 对于 50 % 50\% 50% 的数据, n ≤ 1 0 3 n \le 10^3 n≤103;
- 对于 100 % 100\% 100% 的数据, n ≤ 1 0 5 n \le 10^5 n≤105。
代码
#include<iostream>using namespace std;const int NUM = 1e5+10;int n;
int a[NUM],b[NUM];
int f[NUM][NUM];int main(){cin >> n;for(int i=1;i<=n;i++){cin >> a[i];}for(int i=1;i<=n;i++){cin >> b[i];}for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){f[i][j] = max(f[i-1][j], f[i][j-1]);if(a[i] == b[j]){f[i][j] = max(f[i][j], f[i-1][j-1]+1);}}}cout << f[n][n] << endl;return 0;
}
直接开二维数组会超出长度,需要优化,代码待修改