最大子序列求解 分治法和动态规划
2012-03-08 17:11
405 查看
方法一:采用分治法求解 分为三种状况 将序列递归的二分 而最大值位于三种可能的位置 一是完全位于左边 二是完全位于右边 三是横跨左右代码如下
方法二 动态规划法
可以考虑数组的第一个元素,以及最大的一段数组(A[i], ..., A[j]),和A[0]的关系,有一下几种情况:
1. 当0 = i = j 时,元素A[0]本身构成和最大的一段;
2. 当0 = i < j 时,和最大的一段以A[0]开始;
3. 当0 < i 时, 元素A[0]和最大的一段没有关系。
int maxSubSum(int *A ,int left,int right) { int maxLeftSum=0; int maxRightSum=0; int leftBorderSum=0; int rightBorderSum=0; int maxLeftBorderSum=0; int maxRightBorderSum=0; if(left==right) return A[left]>0? A[left]:0; int center=(left+right)/2; maxLeftSum=maxSubSum(A,left,center); maxRightSum=maxSubSum(A,center+1,right); for(int i=center;i>=left;i--) { leftBorderSum+=A[i]; if(leftBorderSum>maxLeftBorderSum) maxLeftBorderSum=leftBorderSum; } for(int j=center+1;j<=right;j++) { rightBorderSum+=A[j]; if(rightBorderSum>maxRightBorderSum) maxRightBorderSum=rightBorderSum; } return max( max(maxLeftSum,maxRightSum),maxRightBorderSum+maxLeftBorderSum); }
方法二 动态规划法
可以考虑数组的第一个元素,以及最大的一段数组(A[i], ..., A[j]),和A[0]的关系,有一下几种情况:
1. 当0 = i = j 时,元素A[0]本身构成和最大的一段;
2. 当0 = i < j 时,和最大的一段以A[0]开始;
3. 当0 < i 时, 元素A[0]和最大的一段没有关系。
int MaxSubString(int* A,int n) { int Start = A[0]; int All = A[0]; for(int i = 1; i <n; i++) { Start = max( A[i], A[i] + Start); All = max(Start, All); } return All; }
相关文章推荐
- [leetcode]分治法求解最大子序列问题——Java实现
- 动态规划求解最大连续子序列和
- 合唱队----动态规划(求解最大递增/减子序列)
- 动态规划求解最大子段和
- ECNU2958最大上升子序列(动态规划)
- hdu1003(动态规划,最大子序列和)
- 2.4.3最大子序列和问题的求解
- 算法设计与分析——动态规划方法求解序列的连续最大子段和
- 分治法解最大连续公共子序列
- 动态规划_最大非降子序列的长度
- 《github一天一道算法题》:分治法求数组最大连续子序列和
- 最大公共子序列,最大子段和(动态规划)
- 最大子序列和问题(动态规划)
- 最大连续子序列和-动态规划
- HDU - 1231 最大连续子序列(动态规划)
- 蛮力、分治、动态规划求解最大字段和问题(aardio)
- 最大子序列和(Max Subsequence Sum)问题求解
- 最大子序列问题及其求解----C 语言学习
- 动态规划求解连续子数组最大和问题(应该是新的描述方法?)
- lintcode乘积最大子序列(动态规划)