问题描述:
给定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 }