最大子序列求解 分治法和动态规划
来源:互联网 发布:匿名网络发信息到手机 编辑:程序博客网 时间: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;}
- 最大子序列求解 分治法和动态规划
- 子序列最大连续和(动态规划、分治)
- 运用分治法和动态规划方法求解最大子数组问题
- 动态规划求解最大连续子序列和
- 分治法和动态规划求解最长公共子串
- 分治法和动态规划法解最大子序列问题 C++
- 最大子段和-分治&&动态规划
- 子数组最大和 动态规划求解
- 动态规划求解最大子段和
- 最大子段和(动态规划法求解)
- 最大连续子序列和 分治思想和动态规划思想
- 合唱队----动态规划(求解最大递增/减子序列)
- 和最大子序列---动态规划
- [动态规划]最大连续子序列和
- 动态规划之最大子序列和
- 最大连续子序列和-动态规划
- 最大连续子序列和----动态规划
- 动态规划--最大上升子序列和
- [Sysadmin] 在Linux里如何以一般用户的身份挂载NFS或挂载NFS给某一个一般的用户
- InputScope的62个值
- 程序员真的“编码太多没时间思考”了吗 ?
- nginx状态监控
- The type javax.servlet. cannot be resolved 错误解决
- 最大子序列求解 分治法和动态规划
- 注册svnserve为Windows服务
- linux 网络连不上备忘
- 敏捷开发之旅(1) - 新的开始
- Java小基础
- va_start
- Net 2.0 中的发送邮件实现小解(轉)
- 中值滤波使用背景
- 带选项框的listview