最长公共上升子序列C++代码
时间: 2023-11-14 21:46:12 浏览: 84
#include<bits/stdc++.h>
using namespace std;
const int maxn=1005;
int n,m,a[maxn],b[maxn],f[maxn][maxn],pre[maxn][maxn];
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=m;i++) scanf("%d",&b[i]);
for(int i=1;i<=n;i++){
int last=0;
for(int j=1;j<=m;j++){
f[i][j]=f[i-1][j];
pre[i][j]=pre[i-1][j];
if(a[i]==b[j]){
f[i][j]=f[last][j-1]+1;
pre[i][j]=last;
}
if(a[i]>b[j]&&f[i-1][j]>f[last][j-1]){
f[i][j]=f[i-1][j];
pre[i][j]=pre[i-1][j];
}
if(a[i]==b[j]) last=i;
}
}
int ans=0,pos=0;
for(int i=1;i<=n;i++){
if(f[i][m]>ans){
ans=f[i][m];
pos=i;
}
}
printf("%d\n",ans);
if(ans==0) return 0;
vector<int>res;
while(m){
res.push_back(a[pos]);
pos=pre[pos][m--];
}
for(int i=res.size()-1;i>=0;i--) printf("%d ",res[i]);
return 0;
}
阅读全文