題目要找出一個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 }