NOJ1142-最大连续和

最大连续和

时间限制(普通/Java) : 1000 MS/ 3000 MS          运行内存限制 : 65536 KByte
总提交 : 1282            测试通过 : 230 

比赛描述

给出一个长度为n的序列A1,A2,…,An,求最大的连续和。要求找到1≤i≤j ≤n,使得Ai+Ai+1+…+Aj尽量大。

输入

1行输入一个正整数n(n≤1000),此后输入n行,每行给出一个测试用例,包含正整数m和m个整数,以空格分隔各个数。

输出

输出n行。对于每一个测试用例,在一行输出最大的连续和。

样例输入

2
3 1 -1 3
3 1 2 3

样例输出

3
6

 

题目来源

刘汝佳《算法竞赛入门经典》

 

思路:好多OJ上都有这道题,也算是个典型问题吧~~如果要枚举是不可行的,会超时。递推效率会提高但也会超时。最好的还是递归分治没有超时。在蓝桥杯的OJ上也有这道题,同样三种思路测了一下,前两种都是超时的。

 

 1 #include <cstdio>
 2 #include <algorithm>
 3 #include <cstring>
 4 #define MAX 100000 + 10
 5 using namespace std;
 6 
 7 int A[MAX];
 8 int maxsum( int *A, int x, int y )
 9 {
10     int v, L, R, max;
11     if( y - x == 1 )    return A[x];
12     int m = x + ( y - x ) /2;
13     int maxs = std::max( maxsum( A, x, m ), maxsum( A, m, y ) );
14     v = 0;
15     L = A[m - 1];
16     for( int i = m - 1; i >= x; i-- )
17         L = std::max( L, v += A[i] );
18     v = 0;
19     R = A[m];
20     for( int i = m; i < y; i++ )
21         R = std::max( R, v += A[i] );
22     return std::max( maxs, L + R );
23 }
24 
25 int main()
26 {
27     int n, i;
28     scanf( "%d", &n );
29     //char ch;
30     while( n > 0 ) {
31         int m;
32         scanf( "%d", &m );
33         for( i = 0; i < m; i++ ) {
34             scanf( "%d", &A[i] );
35         }
36         int sum = maxsum( A, 0, m );
37         printf( "%d\n", sum );
38         n--;
39     }
40     return 0;
41 }

 

 

 

posted @ 2016-04-10 19:24  这个好玩吗  阅读(268)  评论(0编辑  收藏  举报