这道题就是一道最长公共上升子序列的入门题,说一下我的代码思路:len[x]表示当序列a的前i个序列跟序列b的前x个序列的 最长公共上升子序列,这里用到了滚动数组。就这样
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int inf = 510;
int a[inf],b[inf],len[inf],n,m;
int LCIS() {
int i,j,k,ans=0,loca;
memset(len,0,sizeof(len));
len[0] = -1;
for(i=1; i<=n; i++) {
loca=0;
for(j=1; j<=m; j++) {
if(a[i]>b[j] && len[j]>len[loca]) {
loca = j;
}
if(a[i]==b[j]) {
len[j] = (len[loca]>=0?len[loca]:0)+1;
}
}
}
for(i=1; i<=m; i++) {
if(len[i]>ans) ans = len[i];
}
return ans;
}
int main() {
int t,i,j;
cin>>t;
while(t--) {
cin>>n;
for(i=1; i<=n; i++) cin>>a[i];
cin>>m;
for(i=1; i<=m; i++) cin>>b[i];
cout<<LCIS()<<endl;
if(t) cout<<endl;
}
return 0;
}