两种LIS-->n^2&&nlogn

n^2 的:

初始化 dp 数组为 1
dp[ i ] 表示 以 i 结尾的 LIS 的长度

for ( int i=0 ; i<n ; i++ )
 {
      for( int j = 0 ;  j<i  ;j++)
         {  
               if(a[ i ] > a [ j ]&&dp[ i ]< dp[ j ]+1)
                        dp[ i ]= dp[ j ]+ 1;
          }


int   maxn =-1;
for( int i =0 ; i<n ; i++)
{
      maxn=max( maxn,  dp[ i ]);



nlogn   的:

 如果  a[ i ] 大于 最后一个数, 就接到后面

否则   二分  找到对应的位置 替换掉



    int cnt=0;
    memset(LIS,-1,sizeof(LIS));

    LIS[0]=c[0].r;
    for(int i=1;i<n;i++)
    {
        if(c.r>LIS[cnt])
        {
            cnt++;
            LIS[cnt]=c.r;
        }
        else
        {
            *lower_bound(LIS,LIS+cnt+1,c.r)=c.r;
        }
    } 
posted @ 2013-06-05 01:56  码代码的猿猿  阅读(151)  评论(0编辑  收藏  举报