练习三1003

Problem C

Time Limit : 2000/1000ms (Java/Other)   Memory Limit :65536/32768K (Java/Other)

Total Submission(s) : 17   Accepted Submission(s) : 3

Problem Description

Nowadays, a kindof chess game called “Super Jumping! Jumping! Jumping!” is very popular in HDU.Maybe you are a good boy, and know little about this game, so I introduce it toyou now.<br><br><center><img src=/data/images/1087-1.jpg></center><br><br>Thegame can be played by two or more than two players. It consists of a chessboard(棋盘)and some chessmen(棋子), and all chessmen are marked by a positiveinteger or “start” or “end”. The player starts from start-point and must jumpsinto end-point finally. In the course of jumping, the player will visit thechessmen in the path, but everyone must jumps from one chessman to anotherabsolutely bigger (you can assume start-point is a minimum and end-point is amaximum.). And all players cannot go backwards. One jumping can go from achessman to next, also can go across many chessmen, and even you can straightlyget to end-point from start-point. Of course you get zero point in thissituation. A player is a winner if and only if he can get a bigger scoreaccording to his jumping solution. Note that your score comes from the sum ofvalue on the chessmen in you jumping path.<br>Your task is to output themaximum value according to the given chessmen list.<br>

 

 

Input

Input containsmultiple test cases. Each test case is described in a line asfollow:<br>N value_1 value_2 …value_N <br>It is guarantied that Nis not more than 1000 and all value_i are in the range of 32-int.<br>Atest case starting with 0 terminates the input and this test case is not to beprocessed.<br>

 

 

Output

For each case,print the maximum according to rules, and one line one case.<br>

 

 

Sample Input

3 1 3 2

4 1 2 3 4

4 3 3 2 1

0

 

 

Sample Output

4

10

3

 

题意:其实就是最大递增子段和。


解题思路:想到LIS的DP方程,此题目类似:dp[i]表示以value[i]结尾的最大分数。则状态转移方程为dp[i]=max(dp[j]+value[i],value[i])  其中(value[j]<value[i],表示i可以从j跳过去)(0<=j<i)。


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


你可能感兴趣的:(练习三1003)