最长上升子序列模板(LIS)

1. 复杂度 O(n^2)

#include 
#include 
#include 
using namespace std;
const int maxn = 30010;
int dp[maxn], a[maxn];
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        for(int i=0;iscanf("%d",&a[i]);  
        int ans=0;  
        for(int i=0;i1;  
            for(int j=0;jif(a[j]1);  
            }   
            ans=max(dp[i],ans);  
        }  
        printf("%d\n",ans);  
    }
    return 0;
} 

2. 复杂度 O(nlogn)

lower_bound(dp,dp+n,value) : 这个位置标记了一个不小于value的值
#include   
#include   
#define INF 0x3f3f3f  
using namespace std;  
int dp[30010],a[30010];  
int main()  
{  
    int n,i,j;  
    while(scanf("%d",&n)!=EOF)  
    {  
        for(i=0;iscanf("%d",&a[i]);  
            dp[i]=INF;  
        }  
        for(i=0;iprintf("%d\n",lower_bound(dp,dp+n,INF)-dp);   
    }  
    return 0;  
}

你可能感兴趣的:(HPU2017,动态规划,LIS)