/*
http://acm.hdu.edu.cn/showproblem.php?pid=1087
动态规划
题目是 要求 求出 升序和最大的那个值
从最后那 个 棋子 开始思考,如果 最后的结果 包括这个棋子, 则,从这个 棋子 开始的最大值 就是该棋子的值,因为后面没有棋子了
考虑倒数第二个 棋子, 如果最后的结果包含这个棋子,则从这个棋子开始的最大值 取决于 这个棋子是否能再往前走,
此时,这个棋子前面只有一个棋子即最后的棋子,那么,如果最后的棋子的值比这个棋子的值大,则这个棋子还能往前走,则总的最大值为
这个棋子的值加上最后一个棋子的值,否则 就是该棋子的值
考虑倒数第三个棋子, 如果最后的结果包含这个棋子,则从这个棋子开始的最大值 同样取决于 这个棋子是否还能往前走,
此时,这个棋子前面有两个棋子,那么,则要分别测试 这两个棋子的值是否比 该棋子 大,然后 取总的最大值为该棋子的值
以此类推....
将求得的值 保存在dp 数组中
当对所有的棋子都这样处理了以后, 这个序列的 升序和最大值 就是 dp数组中的最大值
*/
#include <stdio.h>
#include <string.h>
int path[1010];
long long dp[1010];
int main()
{
int n;
while(scanf("%d",&n) && n)
{
memset(path,0,sizeof(path));
memset(dp,0,sizeof(dp));
int i;
for(i=0; i<n; i++)
scanf("%d",&path[i]);
dp[n-1] = path[n-1];
for(i=n-2; i>=0; i--)
{
int j;
long long max=path[i];
for(j=i+1; j<n; j++)
{
if(path[j] > path[i])
{
if(max < path[i]+dp[j])
max = path[i]+dp[j];
}
}
dp[i]=max;
}
int m=0;
for(i=0; i<n; i++)
{
if(dp[i] > dp[m])
m=i;
}
printf("%I64d\n",dp[m]);
}
return 0;
}
1087 Super Jumping! Jumping! Jumping!
最新推荐文章于 2024-08-02 10:00:00 发布