f[i][j]表示以b[j]结尾的最长LCIS
#include<bits/stdc++.h>
using namespace std;
const int N=600;
int n,m,f[N][N],a[N],b[N],s[N],t;
int main(){
cin>>n;
a[0]=-999999;
b[0]=-999999;
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
cin>>m;
// m=n;
for(int i=1;i<=m;i++)
scanf("%d",&b[i]);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(a[i]==b[j]){
for(int k=0;k<j;k++){
if(b[k]<a[i])
f[i][j]=max(f[i][j],f[i-1][k]+1);
}
}
else f[i][j]=f[i-1][j];
}
}
int ans=0,l,p;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
if(f[i][j]>ans){
ans=f[i][j];
l=i;p=j;
}
}
cout<<ans<<endl;
int i=l,j=p;
while(f[i][j]){
if(a[i]!=b[j]){
i--;
}
else{
s[++t]=a[i];
for(int k=0;k<j;k++){
if(f[i-1][k]==f[i][j]-1&&b[k]<b[j]){
j=k;
}
}
}
}
for(int i=t;i>=1;i--)
cout<<s[i]<<" ";
return 0;
}
优化:f[i][j]由f[i-1][j]和f[i-1][j]+1得到,当a[i]=b[j]时由最大的f[i-1][j]转移而来可用一个val存储f[i-1][j]的最大值
#include<bits/stdc++.h>
using namespace std;
const int N=600+100;
int a[N],b[N],n,m,f[N][N],s[N],t;
int main(){
a[0]=-9999999;
b[0]=-9999999;
cin>>n;
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
cin>>m;
for(int i=1;i<=m;i++)
scanf("%d",&b[i]);
for(int i=1;i<=n;i++){
int val;
if(b[0]<a[i])val=f[i-1][0];
for(int j=1;j<=m;j++){
if(a[i]==b[j]){
f[i][j]=val+1;//等同于f[i][j]=max(f[i-1][j])(0<j<j-1)
}
else f[i][j]=f[i-1][j];
if(b[j]<a[i])val=max(val,f[i-1][j]);//更新当前的val
}
}
int ans=0,l,p;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
if(f[i][j]>ans){
ans=f[i][j];
l=i;p=j;
}
}
cout<<ans<<endl;
if(ans==0)return 0;
int i=l,j=p;
while(f[i][j]){
if(a[i]!=b[j]){
i--;
}
else{
s[++t]=a[i];
for(int k=0;k<j;k++){
if(f[i-1][k]==f[i][j]-1&&b[k]<b[j]){
j=k;
}
}
}
}
for(int i=t;i>=1;i--)
cout<<s[i]<<" ";
return 0;
}