Problem Description:
Nowadays, a kind of 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 to you now.
Your task is to output the maximum value according to the given chessmen list.
Input:
Input contains multiple test cases. Each test case is described in a line as follow:
N value_1 value_2 …value_N
It is guarantied that N is not more than 1000 and all value_i are in the range of 32-int.
A test case starting with 0 terminates the input and this test case is not to be processed.
Output:
For each case, print the maximum according to rules, and one line one case.
Sample Input:
3 1 3 2
4 1 2 3 4
4 3 3 2 1
0
扫描二维码关注公众号,回复:
1449288 查看本文章
Sample Output:
4
10
3
题意:棋盘上有n个棋子,所有棋子都用正整数标记,玩家只能从一个棋子跳到另一个更大的棋子上,并且玩家可以穿过多个棋子,但不能后退,求玩家所能得到的最高分。
思路:这道题是dp的思想。
My DaiMa:
#include<stdio.h> #include<iostream> #include<string.h> using namespace std; int main() { int n,a[1003],b[1003],flag,sum;//b[i]数组是用来存前i个棋子能得的最高分 while(~scanf("%d",&n)) { sum=-9999; if(n==0) break; for(int i=0;i<n;i++) scanf("%d",&a[i]); memset(b,0,sizeof(b)); for(int i=0;i<n;i++)//此for循环是dp的核心代码 { flag=0; for(int j = 0; j < i; j ++) { if(a[j]<a[i]&&flag<b[j])//找出前i个棋子中比a[i]棋子小并且分数最高的棋子,记录它的分值 flag=b[j]; } b[i]=flag+a[i];//前i-1个棋子的最高分加上第i个棋子的分,求得即是前i个棋子的最高分 } for(int i=0;i<n;i++) { if(sum < b[i]) sum = b[i]; } printf("%d\n",sum); } return 0; }