LIS n^2&nlogn模板

LIS nlogn模板 http://acm.hdu.edu.cn/showproblem.php?pid=1950

#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string>
#include <math.h>
#include <stdlib.h>
#define maxn 40000+10
using namespace std;
int a[maxn],d[maxn],len;
int bs(int i){
    int l,r,mid;
    l=0,r=len; 
    while(l<r){
        mid=(l+r)/2;
        if(d[mid]>=a[i])r=mid;
        else l=mid+1;
    }
    return l;
}
int main(){
    int T,n;
    scanf("%d",&T);
    while(T--){
        scanf("%d",&n);
        for(int i=1;i<=n;i++)scanf("%d",&a[i]);
        d[1]=a[1];
        len=1;
        for(int i=2;i<=n;i++){
            if(a[i]>d[len])
                d[++len]=a[i];
            else{
                int pos=lower_bound(d,d+len,a[i])-d;
                d[pos]=a[i];//找到>=a[i]的并更新
            }
        }
        printf("%d\n",len);
    }
    return 0;
}

LIS n^2模板  http://poj.org/problem?id=2533

#include <iostream>
#include <cstring>
#include <cstdlib>
#include <stdio.h>
#include <algorithm>
#include <math.h>
#define INF 0x3f3f3f3f
#define maxn 10000+10
using namespace std;
int a[maxn],n,dp[maxn];
int main()
{
    while(cin>>n){
        int len=-1;
        for(int i=1;i<=n;i++)scanf("%d",&a[i]);
        dp[0]=-INF;
        for(int i=1;i<=n;i++){
            dp[i]=1;
            for(int j=0;j<i;j++){
                if(a[i]>a[j])//满足条件时
                    dp[i]=max(dp[i],dp[j]+1);
                if(dp[i]>len)len=dp[i];
            }
        }
        printf("%d\n",len);
    }
    return 0;
}

 

posted on 2015-08-26 20:45  Beserious  阅读(239)  评论(0编辑  收藏  举报