您的位置:首页 > 其它

hdu 1087 Super Jumping! Jumping! Jumping!(水DP)

2011-08-13 14:09 495 查看
求最大上升子序列的和。

记录以每个点为终点的最大和,下一个只要判断是否比前面大,如果大的话,取max{dp[i]+a[k]}。

网上搜了下,没有O(N)的算法。我也想不出来O(N)的 T T 。

#include <queue>
#include <stack>
#include <math.h>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <limits.h>
#include <string.h>
#include <string>
#include <algorithm>
#define MID(x,y) ( ( x + y ) >> 1 )
#define L(x) ( x << 1 )
#define R(x) ( x << 1 | 1 )
#define BUG puts("here!!!")

using namespace std;

const int MAX = 1010;
int dp[MAX];
int a[MAX];
int main()
{
	int n;
	
	while( ~scanf("%d",&n) && n )
	{
		for(int i=0; i<n; i++)
		{
			scanf("%d",&a[i]);
			dp[i] = a[i];
		}
		
		for(int i=1; i<n; i++)
			for(int k=0; k<i; k++)
				if( a[i] > a[k] )
					dp[i] = max(dp[i],dp[k] + a[i]);
		
		int ans = dp[max_element(dp,dp+n) - dp];
		printf("%d\n",ans);
	}
	
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: