UVa 507

  题目大意:最大和子序列问题。由于具有最大和的子序列具有一下性质:第一项不为负数,并且从第一项开始累加,中间不会有和出现负数,因为一旦有负数我们可以抛弃前边的部分以得到更大的子序列和,这将会产生矛盾。

 1 #include <cstdio>
 2 
 3 int main()
 4 {
 5 #ifdef LOCAL
 6     freopen("in", "r", stdin);
 7 #endif
 8     int T;
 9     scanf("%d", &T);
10     for (int kase = 1; kase <= T; kase++)
11     {
12         int n;
13         scanf("%d", &n);
14         int x, sum = 0, nicest = 0, len = 0;
15         int p = 0, s, e;
16         for (int i = 0; i < n-1; i++)
17         {
18             scanf("%d", &x);
19             sum += x;
20             if (sum < 0)
21             {
22                 sum = 0;
23                 p = i + 1;
24             }
25             else if (sum > nicest || (sum == nicest && i-p+1  > len))
26             {
27                 s = p;
28                 e = i;
29                 len = i - p + 1;
30                 nicest = sum;
31             }
32         }
33         if (nicest > 0)   printf("The nicest part of route %d is between stops %d and %d
", kase, s+1, e+2);
34         else   printf("Route %d has no nice parts
", kase);
35     }
36     return 0;
37 }
View Code
原文地址:https://www.cnblogs.com/xiaobaibuhei/p/3265907.html