【JZOJ5424】【NOIP2017提高A组集训10.25】凤凰院凶真

Description

这里写图片描述

Data Constraint

这里写图片描述

Solution

这和以前的一道题很像,叫千帆渡的,刚好是一年前的题,可我还是没想到,就差一点……这说明我的学习是无效学习,以后要加强对过去题目的复习。
再次做好像有了更深的理解。我们设f[i][j]表示与当前A做到i,B做到j,强制i配对的最长公共递增序列。我们顺序枚举i,j,,若当前a[i]!=b[j],那么显然f[i][j]=f[i][j-1].现在问题是a[i]=b[j],因为a[i]=b[j],若存在一个a[k],满足a[k]

Code

#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=5e3+5;
int f[maxn][maxn],g[maxn],f1[maxn][maxn],a[maxn],b[maxn],d[maxn];
int n,m,i,t,j,k,l,x,y,z,p,q;
int main(){
    freopen("okarin.in","r",stdin);freopen("okarin.out","w",stdout);
    scanf("%d",&n);
    for (i=1;i<=n;i++) scanf("%d",&a[i]);
    scanf("%d",&m);
    for (i=1;i<=m;i++)scanf("%d",&b[i]);
    memset(f,128,sizeof(f));
    memset(f[0],0,sizeof(f[0]));
    for (i=1;i<=n;i++)
        for (j=1;j<=m;j++){
            if (a[i]!=b[j]) f[i][j]=f[i][j-1],f1[i][j]=i;
            else f[i][j]=f[g[j]][j-1]+1,f1[i][j]=g[j];
            if (a[i]<b[j+1] && f[g[j+1]][j]<f[i][j]) g[j+1]=i;
            if (f[p][q]<f[i][j]) p=i,q=j;
        }
    printf("%d\n",f[p][q]);
    for (i=q;i>=1;i--)
        if (f1[p][i]!=p) d[++d[0]]=a[p],p=f1[p][i];
    for (i=d[0];i>=1;i--)printf("%d ",d[i]);
}
发布了257 篇原创文章 · 获赞 451 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/crybymyself/article/details/78347085