数据结构--最大子序列和(使用分治策略和递归)
来源:互联网 发布:excel vba 定义数组 编辑:程序博客网 时间:2024/06/10 08:06
例如对于输入:-2,11,-4,13,-5,-2答案为20 为方便起见 若所有整数为负数 则最大子序列和为0
算法一:
分治策略:其想法是把问题分成大致相等的子问题,然后递归的对他们求解,这是“分”的部分,“治”是将两个子问题的解修不到一起并作少量附加工作,最后得到整个问题的解。
对于这个问题,可以分为三个部分,一个是最大子序列可能出现在输入数据的左半部分,第二种是出现在数据的右半部分,还有一种是在中间。第三部分可以通过求出前半部分的最大和(包括前半部分最后一个元素)和后半部分的最大和(包括后半部分的第一个元素),把这两个和相加就是中间部分的最大和,三个最大再比较下即可。
package com.itany.zuidazixulie;public class Test{ public static void main(String[] args) { int[] nums={2,-1,4,7,-6,5,8,-2}; System.out.println("最大子序列和是:"+ maxSumRec(nums,0,nums.length-1)); } // 2 -1 4 7 | -6 9 8 -2 只对个数为2的N次方个数使用 public static int maxSumRec(int[] nums,int left,int right) { //基准情况 即只有一个数的情况 if(left==right) { if(nums[left]>0) return nums[left]; else return 0; } int center=left+(right-left)/2; int maxLeft=maxSumRec(nums,left,center); int maxRight=maxSumRec(nums,center+1,right); int maxLeftBorder=0,leftBorder=0; int maxRightBorder=0,rightBorder=0; for(int i=center;i>=left;i--) { leftBorder+=nums[i]; //此处必须包含边界 所以通过一直相加 如果>最大的和 则还有最大子序列 if(leftBorder>maxLeftBorder) maxLeftBorder=leftBorder; } for(int i=center+1;i<=right;i++) { rightBorder+=nums[i];//此处必须包含边界 所以通过一直相加 如果>最大的和 则还有最大子序列 if(rightBorder>maxRightBorder) maxRightBorder=rightBorder; } return maxOfThree(maxLeft,maxRight,(maxLeftBorder+maxRightBorder)); } //计算三部分中的最大值 public static int maxOfThree(int maxLeft,int maxRight,int center) { int max=maxLeft; if(maxRight>max) { max=maxRight; if(center>max) max=center; } return max; }}
算法二:
package com.itany.zuidazixulie;public class Test2{ public static void main(String[] args) { int[] nums={2,-1,4,7,-69,5,8,-2}; System.out.println("最大子序列和是:"+ maxSumRec(nums)); } public static int maxSumRec(int[] nums) { int max=0; int thisSum=0; for(int i=0;i<nums.length;i++) { thisSum+=nums[i]; if(thisSum>max) { max=thisSum; } //这时之前保存的最大子序列和仍然是存在的 分割 重新开始求和 再和之前的进行比较 else if(thisSum<0) { thisSum=0; } } return max; }}此算法是线性的 它只对数据进行一次扫描,不需要存储数组的其他部分,不仅如此,在任意时刻算法都能对已经读出的数据给出子序列问题的正确答案(其他算法不具有这个特性)。具有这种特性的算法叫做联机算法。仅需要常量空间并且以线性时间运行的联机算法几乎是完美的算法。
0 0
- 数据结构--最大子序列和(使用分治策略和递归)
- 分治策略结合递归思想求最大子序列和
- Rhyme/最大子序列和(分治策略)Java版
- BJFU1274 最大子序列和(分治)
- 杭电1003——Max Sum(最大连续子序列和、递归分治)
- 求序列中最大子序列和(分治算法)
- 数据结构 最大子序列和
- 最大子序列和问题 分治算法
- 最大子序列和分治算法
- 最大子序列和的分治算法
- 分治法求最大子序列和
- 最大子序列和(枚举,分治,DP)
- 递归和分治策略
- 递归和分治策略
- 数据结构顺序表应用7:最大子段和之分治递归法
- 数据结构——顺序表最大子段和分治递归法
- 最大子序列问题,递归和线性
- 分治策略求解子数组最大和并输出下标
- 安装配置初始化MySQL 5.5.39(二进制软件包版)
- 搭建自己的Git服务器失败了
- 搭建LAMP环境_mac使用php和mysql通信
- codeforces 4D. Mysterious Present
- MongoDB3.0正式版已发布!
- 数据结构--最大子序列和(使用分治策略和递归)
- oracle硬解析、软解析、软软解析
- win8系统的电脑重装win7要注意的地方
- poj-1661 Help Jimmy 【DP】
- 2015.02.08关于开机启动字符界面以及切换图形界面的方法
- android 应用中加入支付功能(支付宝集成)
- 8.case语句
- STL算法------查找4
- Java基础—异常处理总结