HDU1257--POJ2533--最长递增子序列(LIS)模板 不知道max_element函数的请点击这里

动态规划写法---时间复杂度:O(n^2)

不知道max_element函数的请点击这里

#include <stdio.h>  
#include <algorithm>  
#include <string.h>  
using namespace std;
int a[1005],dp[1005],n;  
  
int lis()  
{   
    for(int i = 0; i < n; i++)  
    {  
        dp[i] = 1;  
        for(int j = 0; j < i; j++)  
        {  
            if(a[j] < a[i])  
                dp[i] = max(dp[i], dp[j]+1);
        }    
    }  
    return dp[max_element(dp, dp+n)-dp];
}    
int main()  
{  
    int i;  
    while(~scanf("%d",&n))  
    {  
        for(i = 0; i < n; i++) 
        scanf("%d", &a[i]); 
        printf("%d\n", lis());  
    }  
    return 0;  
}  

二分写法---时间复杂度:O(nlogn)

#include <cstdio>
#include <algorithm>
#include <iostream>>
const int MAXN=200001;
using namespace std;
int a[MAXN];
int d[MAXN];
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
   	    for(int i = 1; i <= n; i++)
	    scanf("%d",&a[i]);
	    d[1] = a[1];
	    int len = 1;
	    for(int i = 2; i <= n; i++)
	    {
	        if(a[i] > d[len])
	            d[++len] = a[i];
	        else
	        {
	            int j = lower_bound(d+1,d+len+1,a[i])-d;
	            d[j] = a[i]; 
	        }
	    }
	    printf("%d\n",len);    
	}
     return 0;
}

猜你喜欢

转载自blog.csdn.net/sugarbliss/article/details/80648745