upc 最大上升子序列和#贪心

问题 E: 最大上升子序列和
时间限制: 1 Sec 内存限制: 128 MB

题目描述
一个数的序列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) 等等。 这些子序列中序列和最大为18,为子序列(1,3,5,9)的和。

对于给定的序列,求出最大上升子序列和。注意,最长的上 升子序列的和不一定是最大的,比如序列(100,1,2,3)的最大上升子序列和为100,而最长上升子序列为(1,2,3)。
输入
输入的第一行是序列的长度N(N≤1000)。
第二行给出序列中的N个整数,这些整数的取值范围都在0到10000(可能重复)。
输出
一个整数,为最大上升子序列和。
样例输入 Copy
7
1 7 3 5 9 4 8
样例输出 Copy
18

int a[1001];//原序列 
int s[1001];//序列和 
int DP(int n)
{
	int m = s[0] = a[0];
	for(int i=1;i<n;i++)
	{ 
		for(int j=i-1;j>=0;j--) 
		{
			if(a[i] > a[j] && s[j] > s[i])
			//当前a[i]比之前大且当前序列和大于前一项,更新最大值 
				s[i] = s[j];
		}
		s[i] += a[i]; 
		if (m < s[i]) 	m = s[i];
		//不满足上升,保留当前值
	}
	return m;
}
 
int main() 
{
	int n;	cin >> n;
	for (int i=0;i<n;i++)
		cin >> a[i];
	cout << DP(n) << endl;
	return 0;
}
发布了42 篇原创文章 · 获赞 0 · 访问量 647

猜你喜欢

转载自blog.csdn.net/magic_wenge/article/details/105129022
UPC