codeforces 10D

设f[i][j]为以a[i]为结尾,b数组前j个能组成LCIS的最大值。

if a[i]!=b[j],f[i][j]=f[i][j-1]

else f[i][j]=max(f[k][j-1])(a[i]>a[k] && 1<=k<i)

#include<cstdio>
#include<cctype>
#include<algorithm>
using namespace std;
int read(){
    char c; while(!isdigit(c=getchar())); int x=c-'0';
    while(isdigit(c=getchar())) x=x*10+c-'0'; return x;
}
int a[501],b[501],f[501][501],p[501];
void print(int o){
    if(!o) return;
    print(p[o]);
    printf("%d ",a[o]);
}
int main(){
    int n=read(),ans=0;
    for(int i=1;i<=n;i+=1) a[i]=read();
    int m=read();
    for(int i=1;i<=m;i+=1) b[i]=read();
    for(int i=1;i<=n;i+=1)
        for(int j=1;j<=m;j+=1){
            f[i][j]=f[i][j-1];
            if(a[i]==b[j]){
                f[i][j]=1;
                for(int k=i-1;k>=1;k-=1)
                    if(a[i]>a[k] && f[k][j-1]+1>f[i][j])
                        f[i][j]=f[k][j-1]+1,p[i]=k;
            }
            if(f[i][j]>f[ans][m]) ans=i;
        }
    printf("%d\n",f[ans][m]);
    print(ans);
    return 0;
}

 

posted @ 2017-10-30 19:45  或是七一  阅读(90)  评论(0编辑  收藏  举报