最大连续和

写了一个最大连续和的题目,好久没写了。。。
想想最大连续和有好多种写法、
应该有O(n^2)的,O(nlogn)的 和 O(n)的!

O(n^2)的很简单,就不说了。。。
O(nlogn)的是用分治法,好复杂的说,没写过,也不会写……
O(n)的算法还是比较巧妙的,在此复习一下:
算法流程:
1、先预处理一个数组s[Max] , s[i] = s[i - 1] + a[i];
2、我们知道,当j确定时,“s[j] - s[i - 1]最大”的条件是s[i - 1]要最小!
因此我们只要扫描一次数组s,维护一个“目前遇到过的最小s”即可。
代码:
for(int i = 1; i <= n; i ++)
{
if(s[i] - min > max) max = s[i] - min;
if(s[i] < min) min = s[i];
}
3、输出max即为答案

 

 1 #include <cstdio>
 2 
 3 int a[250500], s[250500], n;
 4 
 5 int main()
 6 {
 7     while(scanf("%d" , &n))
 8     {
 9         if (n == 0) break;
10         for(int i = 1; i <= n; i ++) scanf("%d",&a[i]);
11 
12         s[0] = 0;
13         for(int i = 1; i <= n; i ++) s[i] = s[i-1] + a[i];
14 
15         int max = -(1 << 30);
16         int min = s[0];
17         for(int i = 1; i <= n; i ++)
18         {
19             if(s[i] - min > max) max = s[i] - min;
20             if(s[i] < min) min = s[i];
21         }
22         
23         printf("%d\n" , max);
24     }
25     return 0;
26 }

 

posted on 2013-03-10 21:34  Hmm  阅读(1001)  评论(0编辑  收藏  举报

导航