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 }

 

posted @ 2013-10-06 10:31  努力变瘦  阅读(736)  评论(0编辑  收藏  举报