hpuoj 1763: 最大和 (dp)水

1763: 最大和

时间限制: 1 Sec  内存限制: 128 MB
提交: 10  解决: 4
[ 提交][ 状态][ 讨论版]

题目描述

定义n个元素的序列a[]——长度为m的美丽子序列:a[b[1]] a[b[2]] a[b[3]] ... a[b[m]]。其中1 <= b[i] <= n。满足条件

(1):对任意的1 <= i < m,均有b[i] + 1 < b[i+1];

(2):对任意的1 <= i < m,均有a[b[i]] <= a[b[i+1]] 。

给定一个序列,我想知道它最长的美丽子序列中长度是多少?

输入

有t组测试数据,每组数据给定一个整数N,表示序列的元素个数。下面一行有N个整数,表示序列的N个元素。1 <= t <= 20,1 <= N <= 3000。所有元素均在int范围。

输出

输出一个结果,表示最长美丽子序列的长度。

样例输入

2
3
2 3 4
5
2 3 4 5 6

样例输出

2
3

提示

第一组数据选2 4是最长的。


第二组数据选2 4 6 是最长的。

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#define INF 0x3f3f3f3f
#define ull unsigned long long
#define ll long long
#define IN __int64
#define N 10010
#define M 1000000007
using namespace std;
int a[N],dp[N];
int main()
{
	int t,n,m,i,j,k;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d",&n);
		for(i=0;i<n;i++)
			scanf("%d",&a[i]);
		memset(dp,0,sizeof(dp));
		int mm=0;
		for(i=0;i<n;i++)
		{
			dp[i]=1;
			for(j=0;j<i;j++)
			{
				if(i-j>1&&a[i]>=a[j])
					dp[i]=max(dp[i],dp[j]+1);
			}
			mm=max(mm,dp[i]);
		}
		printf("%d\n",mm);
	}
	return 0;
}


 

你可能感兴趣的:(hpuoj 1763: 最大和 (dp)水)