最长公共子序列变形。
#include<iostream> #include<cstring> #include<cmath> #include<algorithm> #include<cstdio> #include<map> #include<queue> #include<string> #include<vector> using namespace std; int n,M,L; int a[300],b[10030]; int dp[300][10030]; int MAX(int a,int b,int c) { return max(a,max(b,c)); } int main() { scanf("%d",&n); scanf("%d",&M); for(int i=1;i<=M;i++) scanf("%d",&a[i]); scanf("%d",&L); for(int i=1;i<=L;i++) scanf("%d",&b[i]); memset(dp,0,sizeof dp); for(int i=1;i<=M;i++) { for(int j=1;j<=L;j++) { if(a[i]==b[j]) dp[i][j]=MAX(dp[i-1][j-1],dp[i-1][j],dp[i][j-1])+1; else dp[i][j]=max(dp[i-1][j],dp[i][j-1]); } } printf("%d ",dp[M][L]); return 0; }