HDOJ HDU 1087 Super Jumping! Jumping! Jumping!
题目
分类
动态规划
题意
如图
每个人 要从 n个给定的格子从 start 跳到 end
每次能跳过很多个棋子 且 不能后退
每次跳过的格子只能比上一次的大
求最大可以得多少分
题解
每一次得跳跃策略 都影响 下一步
应该有某种递推关系
想到动态规划
我们看规划策略
以 i 为 结尾得最大分值
j 为 当前结尾元素 num[j] 为 j 的 分值
dp[i][j] = max(dp[i][j], dp[i][j] + num[j]) (0 <= i <= n) (0 <= j <= i )( num[i] > num[j] )
代码
#include <iostream>
#include <cstring>
#define maxn 1000
using namespace std;
int num[maxn+1];
int dp[maxn+1];
int main()
{
int n,ans;
while(cin >> n && n)
{
ans = 0;
dp[0] = 0;
memset(dp,0,sizeof(dp));
for(int i = 1;i <= n;i++)
{
cin >> num[i];
dp[i] = num[i];
}
dp[1] = num[1];
for(int i = 1;i <= n;i++)
for(int j = 1;j < i;j++)
{
if(num[j] < num[i])
dp[i] = max(dp[i],dp[j] + num[i]);
}
for(int i = 1;i <= n;i++)
if(dp[i] > ans)
ans = dp[i];
cout << ans << endl;;
}
return 0;
}