最大子序列求解 分治法和动态规划

来源:互联网 发布:匿名网络发信息到手机 编辑:程序博客网 时间:2024/05/17 08:03

方法一:采用分治法求解 分为三种状况   将序列递归的二分  而最大值位于三种可能的位置  一是完全位于左边 二是完全位于右边 三是横跨左右代码如下

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;}



原创粉丝点击