POJ 2533 Longest Ordered Subsequence

地址:http://poj.org/problem?id=2533

题意,求最长单调递增子序列长度

动态规划,求LIS最大不下降子序列

 

O(n^2)和O(n*logn)算法都能完美AC

 

本人弱菜只能写n^2的了,另一种转贴下YoU http://user.qzone.qq.com/289065406/blog/1300023619

 

#include<iostream>
using namespace std;

#define N 1005

int a[N];
int len[N];


int main()
{
    int i,j,n,s;
    while(cin>>n)
    {
       s=0;
       for(i=0;i<n;i++)
       {
         cin>>a[i];            
       }
       memset(len,0,sizeof(len));
       for(i=0;i<n;i++)
       {  
         for(j=0;j<i;j++)
         {
            if(a[i]>a[j]&&len[j]>len[i]) 
              len[i]=len[j];                                       
         }
         len[i]=len[i]+1;
         if(s<len[i]) s=len[i];
       }        
       cout<<s<<endl;
    }
              
    return 0;
}


——————————————分割———————————分割———————————————分割————————————————————

//Memory Time 
//224K   0MS 

//O(n*logn)算法
#include<iostream>
using namespace std;
const int inf=10001;

int binary_search(int ord[],int digit,int length)   //二分法搜索digit,若str中存在digit,返回其下标
{                                                   //若不存在,返回str中比digit小的最大那个数的(下标+1)
	int left=0,right=length;
	int mid;
	while(right!=left)
	{
		mid=(left+right)/2;
		if(digit==ord[mid])
			return mid;
		else if(digit<ord[mid])
			right=mid;
		else
			left=mid+1;
	}
	return left;
}

int main(int i,int j)
{
	int n;
	while(cin>>n)
	{
		int* sq=new int[n+1];
		int* ord=new int[n+1];  //对于dp[]的每一个取值k,ord[k]记录满足dp[i]=k的所有sq[i]中的最小值,即ord[k]=min{sq[i]} (dp[i]=k)

		for(i=1;i<=n;i++)
			cin>>sq[i];

		int max_length=0;
		ord[0]=-1;  //下界无穷小
		int len=1;  //ord的长度
		for(i=1;i<=n;i++)
		{
			ord[len]=inf;  //上界无穷大,指针len总是指向ord最后一个元素的后一位
			j=binary_search(ord,sq[i],len);
			if(j==len)  //sq[i]大于ord最大(最后)的元素
				len++;
			ord[j]=sq[i];
		}
		cout<<len-1<<endl; //len要减去ord[0]的长度1

		delete sq,ord;
	}
	return 0;
}


 

 

你可能感兴趣的:(POJ 2533 Longest Ordered Subsequence)