两种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;
        }
    }  

转载于:https://www.cnblogs.com/CKboss/archive/2013/06/05/3351039.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值