最大子段和系列(二维子段和、环形数组子段和、最大m段和) 思路
2014-08-28 23:13
232 查看
一、最大子段和
设F(i) 为 数组中以a[i]结尾的最大子段和, 那么只需要遍历 0~n 找到max{F(0) F(1) ...... F(n-1)}
F(i) = a[i] F(i-1) < 0
F(i-1) + a[i]
二 、最大环形数组子段和
思路一:把环形最大子段和可以看做两部分。 第一部分——正常最大子段和,第二部分——跨越a[0] 和 a[n-1]的最大子段和。 那么第一部分可以用O(n) 求出,第二部分我们
从a[0] 开始计算 0~n-2 的最大和,记录结束位置position1。 再从a[n-1] 开始计算 n-1~1的最大和,记录结束位置 position2。
position2 > position1 则第二部分最大和 a[0] + ... a[position1] + a[position2] + ...a[n-1]
position2 <= position1 则第二部分最大和 a[0] + ....... a[n-1]
思路二: 数组总和 - 最小子段和
三、最大M段和
问题 :从数组中确定M个不相交的子序列,使这M个子序列的和最大!
设F(i, j) 为 在前i个元素中选j个子段的最大和,且包含元素a[j]. 那么对于a[j] , 1) a[j] 自己组成第 j 子段 ; 2) a[j] 包含于第 j 子段中;
对于情况1) F(i , j) = max{所有 j-1 子段} + a[i] = F(k, j - 1) + a[j] k 属于[j-1, i-1]
对于情况2) F(i , j) = F(i-1, j) + a[i]
显然 F(i, j) 取值为情况1 与 情况2的最大者
四 、二维子段和
思路把二维的压缩为一维
五、绝对值系列
最大绝对值子段和: 要么正的最大,要么负的最小。 所以问题解等于max{abs(最大子段和), abs(最小子段和)}
最小绝对值字段和:
1) 构造数组 b[0] = a[0];
b[1] = a[0] + a[1];
...........
b[n-1] = a[0] + ......+a[n-1];
2) 对b排序(保留index 信息)
3) 求排序后数组相邻位置差最小
设F(i) 为 数组中以a[i]结尾的最大子段和, 那么只需要遍历 0~n 找到max{F(0) F(1) ...... F(n-1)}
F(i) = a[i] F(i-1) < 0
F(i-1) + a[i]
二 、最大环形数组子段和
思路一:把环形最大子段和可以看做两部分。 第一部分——正常最大子段和,第二部分——跨越a[0] 和 a[n-1]的最大子段和。 那么第一部分可以用O(n) 求出,第二部分我们
从a[0] 开始计算 0~n-2 的最大和,记录结束位置position1。 再从a[n-1] 开始计算 n-1~1的最大和,记录结束位置 position2。
position2 > position1 则第二部分最大和 a[0] + ... a[position1] + a[position2] + ...a[n-1]
position2 <= position1 则第二部分最大和 a[0] + ....... a[n-1]
思路二: 数组总和 - 最小子段和
三、最大M段和
问题 :从数组中确定M个不相交的子序列,使这M个子序列的和最大!
设F(i, j) 为 在前i个元素中选j个子段的最大和,且包含元素a[j]. 那么对于a[j] , 1) a[j] 自己组成第 j 子段 ; 2) a[j] 包含于第 j 子段中;
对于情况1) F(i , j) = max{所有 j-1 子段} + a[i] = F(k, j - 1) + a[j] k 属于[j-1, i-1]
对于情况2) F(i , j) = F(i-1, j) + a[i]
显然 F(i, j) 取值为情况1 与 情况2的最大者
四 、二维子段和
思路把二维的压缩为一维
五、绝对值系列
最大绝对值子段和: 要么正的最大,要么负的最小。 所以问题解等于max{abs(最大子段和), abs(最小子段和)}
最小绝对值字段和:
1) 构造数组 b[0] = a[0];
b[1] = a[0] + a[1];
...........
b[n-1] = a[0] + ......+a[n-1];
2) 对b排序(保留index 信息)
3) 求排序后数组相邻位置差最小
相关文章推荐
- 循环数组求最大子段和系列------------普通数组求组大子段和
- 循环数组求最大子段和系列-----------方法1
- 输出二维环形数组中最大子数组和
- 循环数组求最大子段和系列------方法2
- Task 4.4二维环形数组求最大子矩阵之和
- HDU 1422重温世界杯 (环形)最长连续子段 由最大连续子段和变形的到
- hdu1081 DP类最大子段和(二维压缩+前缀和数组/树状数组计数)
- 动态规划问题系列---连续子数组(二维)的最大和
- 返回一个二维整数数组中最大联通子数组的和(思路)
- 51Nod-1050 循环数组最大段和【最大子段和+最小子段和+DP】
- [51NOD1959]循环数组最大子段和(dp,思路)
- 返回一个二维整数数组最大联通子数组的和(思路)
- 二维环形数组求最大子数组和
- [算法] 求环形数组中和值最大子段
- HDU 1024 最大M子段和 滚动数组优化
- 用行指针为函数形参来实现对该二维数组求最大值
- 求一个数组中的最大子段和
- 数组的连续最大子段和
- 编程之美 子数组之和的最大值(二维)
- 微软面试题系列(三):求子数组的最大和