POJ - 2533 Longest Ordered Subsequence (DP最长上升子序列)

                           Longest Ordered Subsequence

Description

A numeric sequence of ai is ordered if a1 < a2 < ... < aN. Let the subsequence of the given numeric sequence (a1, a2, ..., aN) be any sequence (ai1, ai2, ..., aiK), where 1 <= i1 < i2 < ... < iK <= N. For example, sequence (1, 7, 3, 5, 9, 4, 8) has ordered subsequences, e. g., (1, 7), (3, 4, 8) and many others. All longest ordered subsequences are of length 4, e. g., (1, 3, 5, 8).

Your program, when given the numeric sequence, must find the length of its longest ordered subsequence.

Input

The first line of input file contains the length of sequence N. The second line contains the elements of sequence - N integers in the range from 0 to 10000 each, separated by spaces. 1 <= N <= 1000

Output

Output file must contain a single integer - the length of the longest ordered subsequence of the given sequence.

Sample Input

7
1 7 3 5 9 4 8

Sample Output

4

题意描述:
求一组序列的最长上升子序列。

解题思路:
定义一个len[ ]数组存储当前位置是的上升序列数初始化都为1,因所有数本身就是一个上升序列,从第二个数开始查起,当它的前面有数小于它且上升序列数还比它大是更新上升序列数,当查找完当前数的前面所有数后,当前数的上升序列数加一,最后找出len[ ]数组中最大的数就是上升子序列。

#include<stdio.h>
int len[1010],a[1010];
int main()
{
	int n,tempmax,i,k;
	while(scanf("%d",&n)!=EOF)
	{
		for(i=1;i<=n;i++)
		{
			scanf("%d",&a[i]);
			len[i]=1;
		}
		for(i=2;i<=n;i++)
		{
			tempmax=0;
			for(k=1;k<i;k++)
				if(a[k]<a[i]&&tempmax<len[k])
					tempmax=len[k];
			len[i]=tempmax+1;
		}
		tempmax=-1;
		for(i=1;i<=n;i++)
			if(tempmax<len[i])
				tempmax=len[i];
		printf("%d\n",tempmax);
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值