• HDU 5773 The All-purpose Zero 脑洞LIS


    给定一个序列,里面的0是可以任变的。问变化后最长的LIS的长度

    首先,0全部选上是不亏的。这个不知道怎么说,YY一下吧。

    最关键的就是解决2 0 0 3

    这种问题了。

    注意到这个序列的LIS应该是3

    也就是你求LIS的时候,是不能包括0的,因为0是最后全部加上去的。这样你求到的LIS只能是1.

    再来一组数据

    2 0 0 3 0 0 4

    这样的LIS是5,也就是你求到的LIS只能是1.

    这样的话,只有2 1 0求到的LIS是1了。

    也就是每个数减去它前面出现过多少个0,再求一次LIS.

    关键要抓住0要全部用上,想到每个数减去前面有多少个0,比较难想到。抓住0要全部用上。列几组数据,慢慢推还可以。

    (其实是我比较水,想不懂)

    现在还有点难理解

    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    using namespace std;
    #define inf (0x3f3f3f3f)
    typedef long long int LL;
    
    #include <iostream>
    #include <sstream>
    #include <vector>
    #include <set>
    #include <map>
    #include <queue>
    #include <string>
    const int maxn = 100000 + 20;
    int a[maxn];
    int b[maxn];
    bool pos[maxn];
    int dp[maxn];
    int dp_up (int a[],int lena)
    {
        int begin=1;
        while (pos[begin]) begin++;
        b[1]=a[begin];
        int lenb=1;
        for (int i=begin+1;i<=lena;++i)
        {
            if (pos[i]) continue;
            if (a[i] > b[lenb])
            {
                b[++lenb] = a[i];
            }
            else
            {
                int pos = lower_bound(b+1,b+1+lenb,a[i]) - b;
                b[pos] = a[i];
            }
        }
        return lenb;
    }
    int f;
    
    void work ()
    {
        memset(pos,0,sizeof pos);
        memset(dp,0,sizeof dp);
        int n;
        scanf("%d",&n);
        int begin=-1;
        for (int i=1;i<=n;++i)
        {
            scanf("%d",&a[i]);
            if (a[i]==0) dp[i] = dp[i-1]+1;
            else dp[i]=dp[i-1];
            if (a[i]==0) pos[i]=1;
        }
        if(dp[n]==n)
        {
            printf ("Case #%d: %d
    ",++f,n);
            return ;
        }
        for (int i=1;i<=n;++i)
        {
            if (pos[i]) continue;
            else a[i] -= dp[i];
        }
        int ans = dp_up(a,n);
        printf ("Case #%d: %d
    ",++f,ans+dp[n]);
        return ;
    }
    int main()
    {
    #ifdef LOCAL
        freopen("data.txt","r",stdin);
    #endif
        int t;
        scanf("%d",&t);
        while (t--) work();
        return 0;
    }
    View Code
  • 相关阅读:
    win10安装scrapy
    win10安装 pandas
    scrapy 启动失败,scrapy startproject test 出错 'module' object has no attribute 'OP_NO_TLSv1_1
    Mac环境下安装运行splash
    通过软链接解决目录空间不足的问题
    CentOS 图形界面的关闭与开启
    shell+crontab 实时服务进程监控重启
    Linux下查看yun rpm dpkg 软件是否安装成功的方法
    ubuntu设置root登录ssh
    Ubuntu的中文乱码问题
  • 原文地址:https://www.cnblogs.com/liuweimingcprogram/p/5797180.html
Copyright © 2020-2023  润新知