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 ",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 ",len); } return 0; }