杭电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 }