3637 - 最长上升子序列长度0

一个数的序列 bi,当 b1 < b2 < ... < bS的时候,我们称这个序列是上升的。对于给定的一个序列(a1, a2, ..., 

aN),我们可以得到一些上升的子序列(ai1, ai2, ..., aiK),这里 1 <= i1 < i2 < ... <iK <= N。比如,对于序列(1, 7,

 3, 5, 9, 4, 8),有它的一些上升子序列,如(1, 7), (3, 4, 8)等等。

这些子序列中最长的长度是 4,比如子序列(1, 3, 5, 8).

<span style="line-height:1.5;">你的任务,就是对于给定的序列,求出最长上升子序列的长度。</span> 

题目输入

输入的第一行是序列的长度 N (1 <= N <= 1000)。第二行给出序列中的 N个整数,这些整数的取值范围都在 0到

 10000。

题目输出

最长上升子序列的长度。

输入/输出样例

题目输入

7
1 7 3 5 9 4 8

题目输出

4

C语言解答

#include <stdio.h>
int dp[1001];
int a[1001];
int Max(int a,int b)
{
	if(a>b)
	return a;
	else
	return b;
}
int main()
{
	int n,i,max,index,j,b;
	while(scanf("%d",&n)!=EOF)
	{
		max=-99999;
		for(i=0;i<n;i++)
		scanf("%d",&a[i]);
		for(i=0;i<n;i++)
		{
			dp[i]=1;
			for(j=0;j<=i-1;j++)
			{
				if(a[j]<a[i]&&dp[i]<dp[j]+1)
				dp[i]=Max(1,dp[j]+1);
			}
			if(max<dp[i])
			max=dp[i];
		}
		printf("%d\n",max);
	}
	return 0;
}

C++解答

#include <bits/stdc++.h>
using namespace std;
int main()
{
	int n;
	//freopen("F:\\QQDownlaod\\Laputa\\2015.3.23\\0320\\acm\\as\\test.in","r",stdin);
	while(~scanf("%d",&n)){
		int num[1005];
		for (int i=0;i<n;i++) scanf("%d",&num[i]);
		int d[1005];
		memset(d,0,sizeof(d));
		d[0]=1;
		for (int i=1;i<n;i++){
			int ans=0;
			for (int s=0;s<i;s++){
				if (num[i]>num[s]) ans=max(ans,d[s]);
			}
			d[i]=ans+1;
		}
		int ans=0;
		for (int i=0;i<n;i++){
			ans=max(ans,d[i]);
		}
		printf("%d\n",ans);
	}
	return 0;
}
时间限制 1 秒
内存限制 128 MB
讨论 统计
上一题 下一题