最大子段和问题

问题描述:

给定n个整数(可能有负数)组成的序列a1,a2,...,an,求该序列的最大子段和。如果所有整数都是负数,那么定义其最大子段和为0。

思路:

1.暴力枚举左端点右端点然后求和.O(n^3)

2.预处理前缀和,枚举左端点右端点.O(n^2)

3.类似DP

1 for (int i = 0; i < a.length; i++) {
2         b = Math.max(b + a[i], a[i]);
3         if (b > res) res = b;
4     }

4.分治

 1 int maxsum(int *a, int x, int y)//返回左闭右开区间的最大连续和
 2 {
 3     if(y - x == 1)return a[x];//只有一个元素,直接返回
 4     int m = (x + y) / 2;
 5     int maxs = max(maxsum(a, x, m), maxsum(a, m, y));//递归求解左右区间的最大值
 6     int v = 0, L = a[m - 1], R = a[m];
 7     //L为从分界点往左的最大连续和, R为分界点往右的最大连续和
 8     for(int i = m - 1; i >= x; i--)L = max(L, v += a[i]);
 9     v = 0;//清空之前的v
10     for(int i = m; i < y; i++)R = max(R, v += a[i]);
11     return max(maxs, L + R);//合并求解
12 }

 

 

 

posted @ 2019-07-15 21:13  Snow_in_winer  阅读(183)  评论(0编辑  收藏  举报