方法1:哈希转换为LIS问题
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
int Hash[210];
int A[10010];
int dp[10010];
int main(){
// freopen("in.txt","r",stdin);
int N,M;
memset(Hash,-1,sizeof(Hash));
cin>>N>>M;
int c;
for(int i = 0;i<M;i++){
cin>>c;
Hash[c] = i;
}
int L;
cin>>L;
int sum = 0;
for(int i = 1;i<=L;i++){
cin>>c;
if(Hash[c]>=0){
A[++sum] = Hash[c];
}
}
dp[1] = 1;
int ans = 1;
for(int i =2;i<=sum;i++){
dp[i] = 1;
for(int j = 1;j<i;j++){
if(A[j]<=A[i]&&dp[j]+1>dp[i]){
dp[i] = dp[j] +1;
}
}
ans = max(ans,dp[i]);
}
printf("%d",ans);
return 0;
}
方法2:LCS
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
int C[210];
int s[10010];
int dp[210][10010];
int main(){
// freopen("in.txt","r",stdin);
int N,M;
memset(dp,0,sizeof(dp));
cin>>N>>M;
for(int i = 1;i<=M;i++){
cin>>C[i];
}
int L;
cin>>L;
for(int i = 1;i<=L;i++){
cin>>s[i];
}
for(int i =1;i<=M;i++){
for(int j = 1;j<=L;j++){
dp[i][j] = max(dp[i-1][j],dp[i][j-1]);
if(s[j] == C[i]){
dp[i][j]++;
}
}
}
printf("%d",dp[M][L]);
return 0;
}