• BZOJ 1046: [HAOI2007]上升序列


    Time Limit: 10 Sec Memory Limit: 162 MB
    Submit: 5719 Solved: 2010
    [Submit][Status][Discuss]
    Description

      对于一个给定的S={a1,a2,a3,…,an},若有P={ax1,ax2,ax3,…,axm},满足(x1 < x2 < … < xm)且( ax1 < ax
    2 < … < axm)。那么就称P为S的一个上升序列。如果有多个P满足条件,那么我们想求字典序最小的那个。任务给
    出S序列,给出若干询问。对于第i个询问,求出长度为Li的上升序列,如有多个,求出字典序最小的那个(即首先
    x1最小,如果不唯一,再看x2最小……),如果不存在长度为Li的上升序列,则打印Impossible.

    Input

      第一行一个N,表示序列一共有N个元素第二行N个数,为a1,a2,…,an 第三行一个M,表示询问次数。下面接M
    行每行一个数L,表示要询问长度为L的上升序列。N<=10000,M<=1000

    Output

      对于每个询问,如果对应的序列存在,则输出,否则打印Impossible.

    Sample Input

    6

    3 4 1 2 3 6

    3

    6

    4

    5
    Sample Output

    Impossible

    1 2 3 6

    Impossible

    题解

    首先倒过来求出最长下降子序列,然后判断是否能取到,之后开始枚举并更新。
    

    代码

    #include<bits/stdc++.h>
    
    using namespace std;
    const int MAXN = 10005;
    
    int n,m,a[MAXN],dp[MAXN];
    int Max;
    
    int main() {
        scanf("%d",&n);
        for(int i=1; i<=n; i++)
            scanf("%d",&a[i]),dp[i]=1;
        for(int i=n-1;i;i--){
            Max=1;
            for(int j=i+1;j<=n;j++)
                if(a[j]>a[i] && dp[j]+1>Max)
                    Max=dp[j]+1;
            dp[i]=Max;  
        }
        Max=0;
        for(int i=1;i<=n;i++)
            Max=max(dp[i],Max);
    //  cout<<Max<<endl;
        scanf("%d",&m);
        for(int i=1; i<=m; i++){
            int x;
            scanf("%d",&x);
            if(x>Max) cout<<"Impossible"<<endl;
            else{
                int k=0;
                for(int j=1;j<=n;j++)
                    if(dp[j]>=x && a[j]>a[k]){
                        printf("%d ",a[j]);
                        k=j;x--;
                        if(x==0) break;
                    }
                printf("
    ");
            }
        }
        return 0;
    }
  • 相关阅读:
    Redis入门指南
    大公司都有哪些开源项目~~~阿里,百度,腾讯,360,新浪,网易,小米等
    01 背包问题和完全背包
    糖果(动规)
    数的划分(动规)
    鸣人的影分身(动规)
    股票买卖(动规)
    大盗阿福(动规)
    公共子序列(动规)
    滑雪(动规)
  • 原文地址:https://www.cnblogs.com/sdfzsyq/p/9677069.html
Copyright © 2020-2023  润新知