洛谷 P1439 【模板】最長公共子序列
題目描述
給出\(1-n\)的兩個排列\(P1\)和\(P2\),求它們的最長公共子序列。
輸入輸出格式
輸入格式:
第一行是一個數\(n\),
接下來兩行,每行為\(n\)個數,為自然數\(1-n\)的一個排列。
輸出格式:
一個數,即最長公共子序列的長度
輸入輸出樣例
輸入樣例#1:
5
3 2 1 4 5
1 2 3 4 5
輸出樣例#1:
3
說明
【數據規模】
對於\(50%\)的數據,\(n≤1000\)
對於\(100%\)的數據,\(n≤100000\)
思路
一看到是一道模板題就覺得不會很難,但還是看到數據時瞬間覺得**,只會五十分的我......所以就發五十分代碼吧,什么時候我會了\(n log n\)的做法再來更
50分代碼
#include<bits/stdc++.h>
using namespace std;
int a[101001],b[101001];
int f[10000][10001];
int n;
int main() {
scanf("%d",&n);
for(int i=1; i<=n; i++) {
scanf("%d",&a[i]);
}
for(int i=1; i<=n; i++) {
scanf("%d",&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]<<'\n';
return 0;
}