POJ 2533 最大上升子序列

题意很简单,给出一串数字,求最长的子序列,该子序列需要满足的要求是:该子序列递增。

例:

输入1 7 3 5 9 4 8

输出 4

用a[i]表示输入的字符串

这个题首先分解成子问题,子问题是以a[i]结尾的最长子字符串

所以用n[i]表示以a[i]结尾的最长公共子串.

当a[i]大于a[i-1]时,显然n[i]=n[i-1]+1;

当a[i]小于a[i-1]时,要从前面遍历,找到比a[i]小的数字里面对应的n[i]最大的那个,这样就可以与a[i]拼接成子串。

要注意的一点是,此时的n[i]是max(n[i],n[j]+1) 此处j是比a[i]小的元素。

例 1 3 2 4 5 4 3 2 1对第六个数,也就是第二个出现的4,在遍历到第二个数字3时,其对应的n[5]=4,而当继续遍历的时候,下一个元素是2,其对应的n[j]+1应该是3,但n[5]显然不是3,而是4.

代码:

#include<iostream>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
int a[100000];
int n[100000];
int main(){
	int num;
	while(scanf("%d",&num)){
	int i;
	for(i=0;i<num;i++){
		scanf("%d",&a[i]);
	}
	memset(n,0,sizeof(n));
	for(i=0;i<num;i++){
		n[i]=1;
	}
	int j,k;
	for(i=1;i<num;i++){
			for(j=0;j<i;j++){
				if(a[j]<a[i]){
					n[i]=max(n[i],n[j]+1);
				}
			}
	}
	cout<<*max_element(n,n+num);
}
}


猜你喜欢

转载自blog.csdn.net/dcy19991116/article/details/80281958