代码改变世界

杭电ACMsteps 3.2.3 Super Jumping! Jumping! Jumping!

2013-11-30 14:53  凝月流风  阅读(182)  评论(0编辑  收藏  举报

  题目要找出一个player从start 位置到 end位置途中所经过的点的权值之和的最大值,并且经过的点必须严格递增;

  可以将start作为位置0, end作为位置n+1;

  用f[i] 表示到达i位置时所取得的最大和,设集合A = {j < i | v[j] < v[i]}, 即j是i之前所有可能到达 i 的点, 那么f[i] = max {f[i], f[j]+v[i]} 其中j ∈ A

  最后f[n+1] 即是所求的最大值(注意0 和n+1是没有权值的)

  

 1 #include <iostream>
 2 #include <string.h>
 3 using namespace std;
 4 const int maxn = 1010;
 5 int f[maxn];
 6 int main()
 7 {
 8   int i, j, n, v[maxn];
 9   while (cin>>n && n) {
10     for (i = 1; i <= n; i++)
11       cin >> v[i];
12     v[0] = -1; v[n+1] = 0;
13     memset(f, 0, sizeof(f));
14     for (i = 1; i <= n+1; i++) {
15       for (j = 0; j <i; j++) {
16         if (v[j] < v[i] || i == n+1)
17           f[i] = f[j]+v[i] > f[i] ? f[j]+v[i] : f[i];
18       }
19     }
20     cout << f[n+1] << endl;
21   }
22   return 0;
23 }