hdu 1087 Super Jumping! Jumping! Jumping!

这题也是DP,实质就是求最大递增子序列的和。用dp[i]表示从第1个元素到第i个元素的最大递增子序列的和,仔细分析可得出状态转移方程:dp[i]=max{ dp[j]+a[i] }, if(a[i] > a[j] ),其中 j < i。 从左开始遍历每个元素,求得dp[i],dp[i]中最大值即所求。

AC代码:

 

#include<stdio.h>
int main()
{
	int n,i,j,max_num;
	int a[1005],dp[1005];
	while(scanf("%d",&n)!=EOF&&n!=0){
		for(i=0;i<n;i++){
			scanf("%d",&a[i]);
		}
		dp[0]=a[0];
		for(i=1;i<n;i++){
			dp[i]=a[i];
			for(j=0;j<i;j++){
				if(a[i] > a[j]&& dp[j]+a[i]>dp[i]){
					dp[i]=dp[j]+a[i];
					
				}
					
			}
		}
		max_num=-9999999;
		for(i=0;i<n;i++){
			if(dp[i] > max_num)
				max_num=dp[i];
		}
		printf("%d\n",max_num);
	}

	return 0;
}

你可能感兴趣的:(hdu 1087 Super Jumping! Jumping! Jumping!)