[BZOJ1046][HAOI2007]上升序列

来源:互联网 发布:淘宝假授权书处罚 编辑:程序博客网 时间:2024/05/20 17:39

原题地址

:nLi.
(1n10000,1im,1m1000).
考虑按下标顺序构造长度为L的子序列,设构造到第i个数,显然当且仅当已选的数的个数+以第i个数开头的最长上升子序列的长度≥L时,第i个数在最优解中.
那么我们要求以第i个数开头的最长上升子序列的长度,不难发现可以转化为求最长下降序列,问题就解决了.
Θ(n2),233...

AC code:

#include <cstdio>const int N=10010;int n,m;int a[N],b[N],f[N],g[N];int main(){    scanf("%d",&n);    for(int i=1;i<=n;i++) scanf("%d",&a[i]);    for(int i=1,j=n;i<=n;i++,j--) b[i]=a[j];    for(int i=1;i<=n;i++){        g[i]=1;        for(int j=1;j<i;j++){            if(b[j]>b[i]&&g[j]+1>g[i]) g[i]=g[j]+1;        }    }    for(int i=1,j=n;i<=n;i++,j--) f[i]=g[j];    scanf("%d",&m);    for(int i=1;i<=m;i++){        int l,last=0;        scanf("%d",&l);        for(int j=1;j<=n&&l;j++){            if(f[j]>=l&&a[j]>last){                printf("%d%c",a[j],--l?' ':'\n');                last=a[j];            }        }        if(l) printf("Impossible\n");    }    return 0;}
0 0
原创粉丝点击