杭电ACMsteps 3.2.3 Super Jumping! Jumping! Jumping!

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

  能够将start做为位置0, end做为位置n+1;spa

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

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

  

 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 }
相关文章
相关标签/搜索