zoukankan      html  css  js  c++  java
  • hdu--1025--LIS

    这题的考察点 应该有2个

    一个是对于LIS算法的优化 使用进行二分查找的O(nlogn)算法 而不是 O(n^2)

    另一个就是 对于题意的理解... 并不是可以很直观地联系到 最长上升子序列的...

    你可以自己画图 就很直观了..

            touch   me

    另外一个很坑的地方 就是 road || roads  太无语了

    这题 在discuess里 有人提了一个很创新的方法 树状数组---我先自己去琢磨下再说~

    对于LIS  网上有很多篇介绍 但给我感觉那百度到的第一篇 讲了很多没用的话.....

    O(n^2) 就是 一个状态转移方程 dp[X] = max( dp[X],dp[X-1]+1)完事了 然后因为你既然都要接触LIS了 肯定也是有一定基础了 当然都可以自己写出来~

    O(nlogn)的二分思想 很真的是不错的 反正 对于大数据 一般不用这个方法肯定是TLE的...

    使用O(nlongn) 你只要理解这2点(直接搬运他们写的了) -->A数组就是待查找的数组 F[X]数组就是当前最长长度为X时末尾的值-->这个值我们尽量往小了取 这样就可以取得更长的长度 原因见下面:

    假设有两个元素A[x]和A[y],满足
      (1)x < y < t

      (2)A[x] < A[y] < A[t]

      (3)F[x] = F[y]
    此时,选择F[x]和选择F[y]都可以得到同样的F[t]值,那么,在最长上升子序列的这个位置中,应该选择A[x]还是应该选择A[y]呢?
    很明显,选择A[x]比选择A[y]要好。因为由于条件(2),在A[x+1] ... A[t-1]这一段中如果存在A[z],A[x] < A[z] < a[y],则与选择A[y]相比,将会得到更长的上升子序列。

     1 #include <iostream>
     2 #include <algorithm>
     3 using namespace std;
     4 int n , maxLen , cnt = 1;
     5 const int size = 500010;
     6 int arr[size];
     7 int dp[size];
     8 
     9 int bSearch( int val , int len )
    10 {
    11     int l , r , mid;
    12     l = 1;
    13     r = len;
    14     while( l<=r )
    15     {
    16         mid = l + (r-l)/2;
    17         if( val==dp[mid] )
    18             return mid;
    19         else if( val>dp[mid] )
    20             l = mid + 1;
    21         else
    22             r = mid - 1;
    23     }
    24     return l;
    25 }
    26 
    27 int main()
    28 {
    29     int x, y , temp;
    30     while( ~scanf("%d",&n) )
    31     {
    32         maxLen = 1;
    33         for( int i = 1 ; i<=n ; i++ )
    34         {
    35             scanf( "%d %d",&x,&y );
    36             arr[x] = y;
    37         }
    38         dp[1] = arr[1];
    39         for( int i = 2 ; i<=n ; i++ )
    40         {
    41             temp = bSearch( arr[i] , maxLen );
    42             dp[temp] = arr[i];
    43             if( temp>maxLen )
    44                 maxLen++;
    45         }
    46         printf( "Case %d:
    ",cnt++ );
    47         if( maxLen>1 )
    48             printf( "My king, at most %d roads can be built.
    
    ",maxLen );
    49            else
    50                printf( "My king, at most %d road can be built.
    
    ",maxLen );
    51     }
    52     return 0;
    53 }
    View Code

    这里 我用cin cout的时候就tle了....   虽然使用了cin.sync_with_stdio(false);  很无语=-=

      

    just follow your heart
  • 相关阅读:
    电路的耦合方式
    PCBA与PCB的区别
    vue记住密码功能
    数组变异
    element时间选择器插件转化为YYYY-MM-DD的形式
    box-shadow
    从后台传select的值
    jQuery事件(持续更新中)
    JavaScript对象(持续更新中)
    15分XX秒后订单自动关闭(倒计时)
  • 原文地址:https://www.cnblogs.com/radical/p/3847480.html
Copyright © 2011-2022 走看看