• HDU 1257 最少拦截系统 ——(LIS)


      想了一下感觉和lis有关,交了果然AC。想不到很好的证明方法,试做证明如下:lis的每一个点都是一个不上升系统中的一员,设其为a[i],那么a[i-1]<a[i]肯定是成立的(lis的性质),夹在这两者之间的一个元素x,如果其>=a[i],那么它肯定属于a[i]这个系统,如果它小于a[i],且:1.大于a[i-1]的话,违背了lis的性质,2.<=a[i-1]的话,x属于a[i-1]这个系统。不可能有别的情况了。

      归纳如下:给定一个序列,它的LIS长度就是它非上升子序列的个数

      代码如下:

     1 #include <stdio.h>
     2 #include <algorithm>
     3 #include <string.h>
     4 using namespace std;
     5 const int inf = 0x3f3f3f3f;
     6 const int N = 30000 + 5;
     7 
     8 int a[N];
     9 int dp[N];
    10 
    11 int main()
    12 {
    13     int n;
    14     while(scanf("%d",&n) == 1)
    15     {
    16         for(int i=1;i<=n;i++) scanf("%d",a+i);
    17         memset(dp,inf,sizeof dp);
    18         for(int i=1;i<=n;i++)
    19         {
    20             *lower_bound(dp+1,dp+1+n,a[i]) = a[i];
    21         }
    22         printf("%d
    ",lower_bound(dp+1,dp+1+n,inf) - (dp+1));
    23     }
    24     return 0;
    25 }
  • 相关阅读:
    我的省选 Day -9
    我的省选 Day -10
    我的省选 Day -11
    我的省选 Day -12
    我的省选 Day -13
    [NOI2013]快餐店
    我的省选 Day -14
    杭电多校2020第7场-E Expectation
    「联合省选2020」组合数问题
    UR#19 通用评测号
  • 原文地址:https://www.cnblogs.com/zzyDS/p/6400127.html
Copyright © 2020-2023  润新知