题目大意:中文题。
算法思路:最长上升公共子序列。
#include<iostream> #include<cstdio> #include<cstring> using namespace std; #define MAXN 1050 int a[MAXN],b[MAXN]; int n,m; int dp[MAXN]; int main() { int t,k; scanf("%d",&t); while(t--) { memset(dp,0,sizeof(dp)); memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); scanf("%d",&n); for(int i=1; i<=n; i++) { scanf("%d",&a[i]); } scanf("%d",&m); for(int i=1; i<=m; i++) { scanf("%d",&b[i]); } for(int i=1; i<=n; i++) { k=0; for(int j=1; j<=m; j++) { if(a[i]==b[j]) { dp[j]=k+1; } if(a[i]>b[j])//最长下降公共子序列只要这里改为a[i]<b[j]就可以 { k=max(k,dp[j]); } } } int ans=0; for(int i=1;i<=m;i++) { ans=max(ans,dp[i]); } printf("%d\n",ans); } return 0; }