ACM steps 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 }
相關文章
相關標籤/搜索