算法设计与分析实验四:最大子段和问题(Java)_实现教材最大子段和,用一维整型数组a[ ]存储n个整数,n和具体的整数均可键盘输入。-程序员宅基地

技术标签: 算法  java  算法设计与分析  

题目:

1.什么是最大子段和?

举例,数组(-2,11,-4,13,-5,-2)

(-2,11)是一个子段,(-4,13,-5)是一个子段

(-2,11)=9,(-4,13,-5)=4, 9和4就是子段和

这个数组中,(11,-4,13)=20,20就是最大的子段和

2.采用了分治法

       分治法求解问题的过程是,将整个问题分解成若干个小问题后分而治之。如果分解得到的子问题相对来说还太大,则可反复使用分治策略将这些子问题分成更小的同类型子问题,直至产生出方便求解的子问题,必要时逐步合并这些子问题的解,从而得到问题的解。

     由算法思路可知,分治法求解很自然地可以用一个递归过程来表示。可以这样说,分治法就是一种找大规模问题与小规模问题关系的方法,是递归设计方法的一种具体策略。

3.题目分析

      分解方法采用二分法,虽然分解后的子问题并不独立,但过对重叠的子问题进行专门处理,并对所有子问题合并进行设计,就可以用二分策略解此题。

     如果将所给的序列a[1:n]分为长度相等的两段a[1:(n/2)]和a[(n/2)+1:n],分别求出这两段的最大子段和,则a[1:n]的最大子段和有3种情形。

情形(1)  a[1:n]的最大子段和与a[1:(n/2)]的最大子段和相同;

情形(2)  a[1:n]的最大子段和与a[(n/2)+1:n]的最大子段和相同;

情形(3)  a[1:n]的最大子段和为a[i:j],且1≤i<(n/2),(n/2)+1≤j<n。

情形(1)和情形(2)可递归求得。

对于情形(3),序列中的元素a[(n/2)]与a[(n/2)+1]一定在最大子段中。

     因此,可以计算出a[i:(n/2)]的最大值sl;并计算出a[(n/2)+j]中的最大值s2。s1+s2为出现情况(3)时的最优值。

4.实现代码

import java.util.Scanner;

public class Test4 {

    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入数据的个数:");
        int z = scanner.nextInt();
        int [] a = new int [2^31-1];//数组存放数列
        System.out.println("请输入数列:");
        for (int i =1;i<=z;i++)
        {a[i]=scanner.nextInt();}
        System.out.println("最大子段和为"+maxSum(a,a.length ));
    }

    //为了保持算法接口的一致,所以通过maxSum()函数调用maxSubSum()函数
    //a为数组,n为数组长度
    public  static int maxSum(int a[],int n){
         return maxSubSum(a, 0,n-1);
    }


    public static int maxSubSum(int a[] , int left, int right) {
        int center, i,left_sum, right_sum, s1, s2, lefts, rights;
        if (left == right)//左右两边相等,即数组只有一个元素
            if (a[left] > 0)//元素大于0
                return (a[left]);
            else//元素小于0,按照定义子段和等于0
                return (0);
        else {//有多个元素
            center = (left + right) / 2;//设置数组中点
            left_sum = maxSubSum(a, left, center);//左序列最大子段和
            right_sum = maxSubSum(a, center + 1, right);//右序列最大子段和

            //第三种情况a[1:n}的最大子段和为a[i:j],且1<=i<=(n/2),(n/2)+1<=j<=n
            s1 = 0;//a[i:(n/2)]的最大值
            lefts = 0;
            for (i = center; i >= left; i = i - 1) {
                lefts = lefts + a[i];
                if (lefts > s1)
                    s1 = lefts;
            }

            s2 = 0;//a[i:(n/2)+1]的最大值
            rights = 0;
            for (i = center + 1; i <= right; i = i + 1) {
                rights = rights + a[i];
                if (rights > s2)
                    s2 = rights;
            }

            //三者比较
            if(s1 + s2 < left_sum && right_sum < left_sum)
                return left_sum;
            if(s1 +s2 < right_sum)
                return right_sum;
            return (s1 + s2);
        }
    }
}
//测试用例
//6 -1 5 4 -7   结果14
//0 6 -1 1 -6 7 -5   结果7

5.结果截图

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/TNTvichy/article/details/130048899

智能推荐

使用IPSET屏蔽美国IP_ipset封禁国外ip-程序员宅基地

文章浏览阅读387次,点赞6次,收藏8次。最近被美国IP盯上了,瞄的不间断攻击ADD-TO-CART页面。记录下用IPSET屏蔽过程。执行如下脚本,将IP地址段中的记录转换为Ipset指令,保存在。_ipset封禁国外ip

nodejs的字符串操作模块_nodejs 字符串操作模块-程序员宅基地

文章浏览阅读3.2w次。nodejs字符串操作简介需要引入querystring对象,querystring对象的方法有stringifyquerystring.stringify(“对象”,“分隔符”,“分配符”),将一个json对象,转为字符串,通过指定的分隔符,以及分配符 具体代码:var querystring = require('querystring');var result = querystring.s_nodejs 字符串操作模块

李宏毅机器学习笔记第1周-机器学习基本概念_anomaly compression-程序员宅基地

文章浏览阅读855次。机器学习基本概念_anomaly compression

MD5碰撞-程序员宅基地

文章浏览阅读9.4k次,点赞29次,收藏109次。在CTF中可以说是经常碰到md5加密了,一般都是进行强比较抑或是弱比较,考法非常多,但是万变不离其中。只要我们掌握了原理,一切问题便迎刃而解了。文章首发于我的博客,格式可能比较清晰,有兴趣了解CTF中MD5碰撞的伙伴可以移步查看。_md5碰撞

普里姆算法c语言(详细解读)_c语言普里姆算法-程序员宅基地

文章浏览阅读854次,点赞5次,收藏12次。找到与这个系统邻接的边(0,1),(5,4),比较两者的权值,容易发现权值最小的为25,因此加入边(5,4),同时加入结点4和边(5,4)。4.将0,5,4,3以及相关的边看成一个整体,与其邻接的边有(0,1)28,(4,6)24,(3,6)18,(3,2)12,四个边中权值最小的边是(3,2),所以加入结点2以及边(3,2)。5.与4中所构成的整体邻接的边有(0,1)28,(4,6)24,(3,6)18,(2,1)16,四者中权值最小的边为(2,1),所以加入结点1以及边(2,1)。_c语言普里姆算法

nohub 和 & 在linux上不间断后台运行程序-程序员宅基地

文章浏览阅读3.1k次,点赞2次,收藏15次。长时间在服务器上运行深度学习代码,使用nohub 命令行 & 可以让代码不间断在后台运行_nohub

随便推点

docker配置国内镜像源_docker国内镜像源-程序员宅基地

文章浏览阅读3.3w次,点赞9次,收藏25次。刚开始学习docker,发现下载镜像非常的慢。如果不经过,docker的镜像下载都来源于国外,因此需要配置国内的镜像源。Docker中国区官方镜像。_docker国内镜像源

Unity中怎么播放视频_unity 播放视频-程序员宅基地

文章浏览阅读1.9w次,点赞40次,收藏209次。一.首先在场景中新建UI中的Raw Image可以按住Alt再点击下图红色箭头所示将Raw Image铺满游戏全屏(也可以自己调整大小)二.给Raw Image添加Video Player组件三.在Assets或者自己想要的文件夹中创建Render Texture四.将准备好的视频(这里用到的视频格式是mp4)拖入项目中并做如下修改这里我把新建的Render Texture命名为2,拖入的视频也命名为2(随便命的,不要在意)这里我们看到这个Render Te..._unity 播放视频

使用BOOTICE 恢复系统启动项_bootice保存后没用-程序员宅基地

文章浏览阅读9.7k次,点赞2次,收藏9次。使用BOOTICE 恢复系统启动项我在安装deepin 系统的时候,经常遇到重启进不去系统,每次重启都会进入windows 系统,这让我感到特别头疼,试了好多次都不成功,有些情况是,成功后再次重启又回到了windows系统。后来终于在PE中利用一款叫做BOOT ICE的工具成功解决。BOOTICE— 引导扇区维护工具简介BOOTICE 是一个启动相关的维护的小工具,主要用于安装、修复、备份和恢复磁盘_bootice保存后没用

文本分类与SVM_svm分类-程序员宅基地

文章浏览阅读9.5w次,点赞54次,收藏202次。之前做过一些文本挖掘的项目,比如网页分类、微博情感分析、用户评论挖掘,也曾经将libsvm进行包装,写了一个文本分类的开软软件Tmsvm。所以这里将之前做过一些关于文本分类的东西整理总结一下。1 基础知识1. 1 样本整理文本分类属于有监督的学习,所以需要整理样本。根据业务需求,确定样本标签与数目,其中样本标签多为整数。在svm中其中如果为二分类,样本标签一般会设定为-1和_svm分类

力扣——206.反转链表_力扣链表反转-程序员宅基地

文章浏览阅读141次。题目python代码方法一:利用新列表,创建新的链表# Definition for singly-linked list.# class ListNode(object):# def __init__(self, val=0, next=None):# self.val = val# self.next = nextclass Solution(object): def reverseList(self, head): ""_力扣链表反转

如何解决深度冲突(Z-fighting),画面闪烁的问题-程序员宅基地

文章浏览阅读3.6k次,点赞3次,收藏6次。参考:OpenGL教程:深度测试深度冲突一个很常见的视觉错误会在两个平面或者三角形非常紧密地平行排列在一起时会发生,深度缓冲没有足够的精度来决定两个形状哪个在前面。结果就是这两个形状不断地在切换前后顺序,这会导致很奇怪的花纹。这个现象叫做深度冲突(Z-fighting),因为它看起来像是这两个形状在争夺(Fight)谁该处于顶端。防止深度冲突第一个也是最重要的技巧是永远不要把多个物体摆得太靠近,以至于它们的一些三角形会重叠。通过在两个物体之间设置一个用户无法注意到的偏移值,你可以完全避免这两个物体之_深度冲突

推荐文章

热门文章

相关标签