基础的lcs,错了好几遍的原因:
1:题意,首先给出的序列并不是我们要求的,而是代表了第几个数的历史时间,要经过转化。
2:怎样退出,没有告诉你到底有几个。
#include<stdio.h>
#include<iostream>
#include<vector>
#include<string.h>
using namespace std;
int a[25];
int b[25];
int s[25][25];
int n;
int ans;
void solve1();
void solve2();
int main(){
scanf("%d",&n);
if(n>=1){
for(int i=1;i<=n;i++){
int temp;
scanf("%d",&temp);
a[temp] = i;
}
while(1){
for(int i=1;i<=n;i++){
int temp;
if(scanf("%d",&temp)==EOF) return 0;
b[temp] = i;
}
ans = 0;
memset(s,0,sizeof(s));
solve2();//剪下枝,若完全一样就不用dp了
if(ans!=n) solve1();
printf("%d\n",s[n][n]>ans?s[n][n]:ans);
}
}
return 0;
}
void solve2(){
for(int i=1;i<=n;i++){
if(a[i]==b[i]) ans++;
}
}
void solve1(){
for(int i=1;i<=n;i++){ //b
for(int j=1;j<=n;j++){ //a
if(b[i]==a[j]){
s[i][j] = s[i-1][j-1]+1;
}
else{
s[i][j] = max(s[i][j-1],s[i-1][j]);
}
}
}
}