1006. 求和游戏
http://acm.sjtu.edu.cn/OnlineJudge/problem/1006
这道题目和最大连续子序列不同的是,要求子序列至少包含两个元素。
用 sum[i] 表示sigma{a[j], j=1...i},即前缀和
用 m[i] = min{sum[j], j=1...i} , m[0] = 0
这样 sum[i]-m[i-2] 就表示以 i 结尾的至少包含两个元素的最大连续子序列和,所以问题可以表示为求 ans = min{sum[i]-m[i-2], i=2...n}
1 # include <stdio.h> 2 3 # define INF 105 4 5 int n, x, tmp; 6 7 int curSum, minSum; 8 int ans; 9 10 int Min(int x, int y) {return x<y ? x:y;} 11 int Max(int x, int y) {return x>y ? x:y;} 12 13 int main() 14 { 15 scanf("%d", &n); 16 minSum = INF; 17 curSum = 0; 18 ans = 0; 19 for (int i = 0; i < n; ++i) { 20 scanf("%d", &x); 21 curSum += x; 22 ans = Max(ans, curSum-minSum); 23 minSum = Min(minSum, curSum-x); 24 tmp = x; 25 } 26 27 if (ans > 0) printf("%d\n", ans); 28 else printf("Game Over\n"); 29 30 return 0; 31 }