@[TOC]java代码求解最大子段和问题

什么是最大子段和问题

给定一个数组(元素已知),元素由正整数,负整数两种元素组成,现在求该数组中从哪个位置到哪个位置对应元素所组成的子段和最大,这个子段和就叫做最大子段和。

分析问题(分治思想)

最大子段和不是在“前半段”(a[0] ~ a[mid])就是在“后半段”a[mid+1] ~ a[a,length-1],要么就是由“前半段部分元素和后半段部分元素连接起来a[i] ~ a[j]所构成(其中i(从mid ~ 0),j(从mid+1) ~ (a.length -1);”
就以数组a[] = {-1,3,2}为例

前半段从-1 ~3 后半段从2 ~ 2(也就是它本身) DSZ就指的是前半段和后半段所连接的“累加和最大的”子段和
之后我们可以判断这三个值的大小 从而得出当前数组的最大子段和

发现捷径

当数组长度为2时可以比较a,b,a+b三个数的大小 从而选出最大值即为最大子段和

当数组长度大于2时 需递归调用方法将数组划分为长度等于2的小数组,逐步得到所要求数组的最大子段和。

因为当将数组划分到长度等于2的时候对应的小长度数组的最大子段和可以轻松的求解出来,进而一步步向所求数组一步步靠拢进而得到最终的最大子段和。

if(mid == 0){x = a[0];y = a[1];z = x + y;if(x > y){max = x;}else max = y;if(max > z){max = max;}else {max = z;}return max;}

定义一个DSZ方法,用于返回当前数组前半段和后半段连接所构成的“累加和最大的”子段和

public static int DSZ(int a[]){int mid = (a.length-1)/2;int H = a.length;int i,j,max,x,y,z,L,D;if(H%2 != 0){L = mid+1;D = mid ;}else {L = mid +1;D = mid +1; }int[] d = new int[L];int[] e = new int[D];for(max = 0,i = mid,j = 0;i >=0;i--,j++){max += a[i];d[j] = max;}for(max = 0,i = (mid+1),j = 0;i < a.length;i++,j++){max += a[i];e[j] = max;}x = mid - ZDS(d);           y = mid +ZDS(e)+1;for(max = 0,i = x;i <= y;i++){max += a[i];}return max;}

定义ZDS(最大数)方法用于辅佐DSZ方法求出前半段和后半段“累加和最大”的子段和

public static int ZDS(int a[]){int max,i,j = 0;for(i = 0,max = 0;i < a.length;i++){if(max < a[i]){max = a[i];}}for(i = 0;i < a.length;i++){if(max == a[i]){j = i;}}return j;}

排版方法

import java.util.Scanner;
public class ZDZD4{public static void main(String[] args){System.out.println("请输入数组元素并用逗号隔开:");Scanner s1 = new Scanner(System.in);String str = s1.next().toString();String[] b = str.split(",");int[] a = new int[b.length];for(int j = 0;j < a.length;j++){a[j] = Integer.parseInt(b[j]);System.out.print(a[j]+" ");}System.out.println();System.out.print("该数组的最大子段和为:"+ZDZD1(a));}public static int ZDZD1(int a[]){int i,j,x,v,max,y = 0,z = 0,n = 0,m = 0,H,L,D,t,q;int mid = (a.length-1) / 2;int O = a.length;if(O == 1){return a[0];}else if(O%2 != 0){L = mid+1;D = mid ;}else{L = mid +1;D = mid +1; }int[] b = new int[L];int[] c = new int[D];if(mid == 0){x = a[0];y = a[1];z = x + y;if(x > y){max = x;}else max = y;if(max > z){max = max;}else {max = z;}return max;}else {  x = DSZ(a);for(i = 0;i <= mid ;i++){b[i] = a[i];}for(v = mid+1,j= 0;v < a.length;v++){if(a[v] != 0){c[j] = a[v];j++;}}n = ZDZD1(b);m = ZDZD1(c);if(n > m){max = n;}else {max = m;}if(max > x){max = max;}else {max = x;}return max;}}public static int DSZ(int a[]){int mid = (a.length-1)/2;int H = a.length;int i,j,max,x,y,z,L,D;if(H%2 != 0){L = mid+1;D = mid ;}else {L = mid +1;D = mid +1; }int[] d = new int[L];int[] e = new int[D];for(max = 0,i = mid,j = 0;i >=0;i--,j++){max += a[i];d[j] = max;}for(max = 0,i = (mid+1),j = 0;i < a.length;i++,j++){max += a[i];e[j] = max;}x = mid - ZDS(d);           y = mid +ZDS(e)+1;for(max = 0,i = x;i <= y;i++){max += a[i];}return max;}public static int ZDS(int a[]){int max,i,j = 0;for(i = 0,max = 0;i < a.length;i++){if(max < a[i]){max = a[i];}}for(i = 0;i < a.length;i++){if(max == a[i]){j = i;}}return j;}
}

JAVA代码求解最大子段和问题相关推荐

  1. 【运筹优化】求解二维矩形装箱问题的算法合辑 + Java代码实现

    文章目录 一.算法合辑 1.1 结合自定义策略 1.1.1 结合自定义策略的禁忌搜索算法(98.80%) 1.2.1 结合自定义策略的蚁群算法(96.70%) 1.2 堆优化的天际线启发式算法(98. ...

  2. 【强化学习】Q-Learning算法求解迷宫寻路问题 + Java代码实现

    文章目录 前言 一.Q-Learning算法简介 1.1 更新公式 1.2 预测策略 1.3 详细资料 二.迷宫寻路问题简介 三.Java代码 3.1 环境说明 3.2 参数配置 3.3 迷宫环境类 ...

  3. 转 | 禁忌搜索算法(Tabu Search)求解带时间窗的车辆路径规划问题详解(附Java代码)

    以下文章来源于数据魔术师 ,作者周航 欲下载本文相关的代码及算例,请关注公众号[程序猿声],后台回复[TSVRPJAVA]不包括[]即可 前言 大家好呀! 眼看这9102年都快要过去了,小编也是越来越 ...

  4. Tabu Search求解作业车间调度问题(Job Shop Scheduling)-附Java代码

    本文来源于公众号[程序猿声],作者舟寒丶 作业车间调度问题 问题模型 举个栗子 有关禁忌搜索算法的内容,公众号内有详细教程: 干货 |[算法]禁忌搜索算法(Tabu Search,TS)超详细通俗解析 ...

  5. 【运筹优化】AFSA人工鱼群算法求解无约束多元函数最值(Java代码实现)

    文章目录 前言 优化目标 求解结果 迭代结果可视化 算法流程 Java代码 可视化代码 前言 本文以求解二元函数最小值为例,如果需要求解多元函数,只需要修改以下变量即可: varNum:变量维度数 u ...

  6. 【运筹优化】结合天际线启发式的蚁群算法求解二维矩形装箱问题 + Java代码实现

    文章目录 一.天际线启发式 二.蚁群算法结合天际线启发式 2.1 构建序列 2.1.1 思路一 2.1.2 思路二 2.1.3 思路N 三.Java代码实现 3.1 项目结构 3.2 Ant 3.3 ...

  7. java 路径规划_转 | 禁忌搜索算法(Tabu Search)求解带时间窗的车辆路径规划问题详解(附Java代码)...

    以下文章来源于数据魔术师 ,作者周航 欲下载本文相关的代码及算例,请关注公众号[程序猿声],后台回复[TSVRPJAVA]不包括[]即可 前言 大家好呀! 眼看这9102年都快要过去了,小编也是越来越 ...

  8. 干货 | Tabu Search求解作业车间调度问题(Job Shop Scheduling)-附Java代码

    本文来源于公众号[程序猿声],作者舟寒丶 作业车间调度问题 问题模型 举个栗子 有关禁忌搜索算法的内容,公众号内有详细教程: 干货 |[算法]禁忌搜索算法(Tabu Search,TS)超详细通俗解析 ...

  9. 【智能算法】FA萤火虫算法求解无约束多元函数最值(Java代码实现)

    文章目录 前言 优化目标 求解结果 搜索过程可视化 Java代码 可视化代码 前言 本文以求解二元函数最小值为例,如果需要求解多元函数,只需要修改以下变量即可: varNum:变量维度数 ub和lb: ...

最新文章

  1. linux postgresql .run包卸载,linux下删除自带的postgresql 及全新安装
  2. PHPExcel开发者文档[中文版]
  3. 等同于JavaScript isset()
  4. php访问数组用引号_php双引号中访问数组元素报错如何解决
  5. 接收请求处理流程_从Tomcat入口了解Spring MVC的请求处理流程(2)问题答疑
  6. 前端学习(2169):vue-router安装和配置方式
  7. C语言中printf(built: %s %s,__TIME__,__DATE__);方便调试
  8. 一个java工程师必知的安全意识(信息传输篇)
  9. Docker学习总结(69)—— 不用 Docker 如何构建容器
  10. python读取文件名有中文_[请教]python的中文文件名处理
  11. Cocos2d-x 3.2 的内存管理详解
  12. [转]在WPF中打开网页方法总结
  13. Android视频融合特效播放与渲染
  14. Windows蓝屏之后,DUMP分析教程
  15. 量化交易系统之python+mysql(二)
  16. Windbg使用详解
  17. java lang arithmetic_java.lang.ArithmeticException: Division undefined
  18. 风靡IT圈的史诗级漏洞log4j2的产生原理及复现
  19. diy无感无刷电机霍尔安装_无刷直流电机霍尔传感器安装方法研究
  20. OpenPAI1.3.0 部署

热门文章

  1. 弹弹岛2服务器维护,《弹弹岛2》8月24日更新维护公告 新增治疗图腾与技能致盲弹[图]...
  2. HTML,CSS,JavaScript制作美文赏析网页
  3. Android模拟登陆带验证码的网站客户端
  4. HttpEntity的类型及其使用
  5. 运动需要用到哪些东西?运动装备用品推荐
  6. 健康误区:口渴了才喝水 困了才睡觉
  7. html取消转义符,HTML转义符
  8. webpack打包 设置小图片自动转换base6
  9. 犬夜叉手游觉醒服务器维护,犬夜叉觉醒安卓手游_犬夜叉觉醒手游最新版-优基地...
  10. 开篇鸿蒙谁为情种意思,【谁为情种】开辟鸿蒙 谁为情种