zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    6.简易计算器
    5.用户密码管理
    4.方法重载
    3.对象数组做参数
    2.迷你DVD管理系统
    1.二维数组计算班级成绩
    31.向数组中插入一个元素
    30.使用Arrays类的各种方法
    Java开发中的23种设计模式详解(转)
    个人代码归档
  • 原文地址:https://www.cnblogs.com/zzyDS/p/6400127.html
Copyright © 2011-2022 走看看