zoukankan      html  css  js  c++  java
  • COGS 渡轮问题 (LIS规定字典序输出方案数)

    /*
    下标字典序最小 
    */
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #define maxn 10010
    using namespace std;
    int n,a[maxn],f[maxn],pre[maxn],len=1,k=1,ans[maxn],size;
    int main()
    {
        //freopen("maxxl.in","r",stdin);
        //freopen("maxxl.out","w",stdout);
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
          {
              scanf("%d",&a[i]);
              f[i]=1;
          }
        for(int i=1;i<=n;i++)
          for(int j=1;j<i;j++)
            if(a[i]>=a[j]&&f[i]<f[j]+1)
              {
                  f[i]=f[j]+1;pre[i]=j;
                  if(f[i]>len)
                    {
                        len=f[i];
                        k=i;
                  }
              }
        printf("%d
    ",len);
        while(k)
          {
              ans[++size]=a[k];
              k=pre[k];
          }
        for(int i=size;i>=1;i--)
          printf("%d ",ans[i]);
        return 0;
    }
    /*
    序列字典序最小 
    */
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #define maxn 10010
    using namespace std;
    int n,x,c[maxn],ans[maxn],len,pre[maxn];
    int main()
    {
        //freopen("maxxl.in","r",stdin);
        //freopen("maxxl.out","w",stdout);
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
          {
              scanf("%d",&x);
              if(x>c[len])
                {
                    pre[x]=c[len];
                  c[++len]=x;
                  continue;
              }
            int l=0,r=len,p=0;
            while(l<=r)
              {
                  int mid=(l+r)/2;
                  if(c[mid]<x)
                    {
                        p=mid;
                        l=mid+1;
                  }
                else r=mid-1;
              }
            pre[x]=c[p];
            c[p+1]=x;
          }
        int k=c[len],size=0;
        printf("%d
    ",len);
        while(k)
          {
              ans[++size]=k;
              k=pre[k];
          }
        for(int i=size;i>=1;i--)
          printf("%d ",ans[i]);
        return 0;
    }
  • 相关阅读:
    03-链表
    23-自定义用户模型
    01-使用pipenv管理项目环境
    10-多线程、多进程和线程池编程
    17-Python执行JS代码--PyExecJS、PyV8、Js2Py
    09-Python-Socket编程
    08-迭代器和生成器
    07-元类编程
    06-对象引用、可变性和垃圾回收
    05-深入python的set和dict
  • 原文地址:https://www.cnblogs.com/yanlifneg/p/5563213.html
Copyright © 2011-2022 走看看