zoukankan      html  css  js  c++  java
  • 求数列中最大子数组的和

    1.练习题目

    题目:返回一个整数数组中最大子数组的和。

    要求:

    输入一个整形数组,数组里有正数也有负数。

    数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。

    求所有子数组的和的最大值。要求时间复杂度为O(n)。 

    结对编程要求:

    两人结对完成编程任务。

    一人主要负责程序分析,代码编程。

    一人负责代码复审和代码测试计划。

    发表一篇博客文章讲述两人合作中的过程、体会以及如何解决冲突(附结对开发的工作照)。(截止到周日3月24日24:00)

    2.设计思想

    基本思想1

    在和最大的子数列的两端肯定没有负数,负数只可能存在于子数列的中间部分,所以若数列的两端是负数,则将其舍弃不计入子数列。

    基本思想2

    整体法思想,即,将子数列左端第一个数和左端第二个数的和看作一个数,可以进行消元化简。

    基本思想3

     最大值思想,初始时将数列左端第一个数作为默认最大值,对数列第一个数进行判断,若该数是负数,运用思想1若为正数运用思想2从左到右依次进行,运用思想2是将每次求得的和与最大值比较,若比最大值大,则更新最大值。

    这样即可得到最大值,然后只要为取得最大值时的子数列的设置开始和结束的标志,可以得到子数列的序列。

    3.程序源代码

    import java.util.Random;

    import java.util.Scanner;

    public class zudazishuzu {

    /**

     * @param args

     */

    public static void main(String[] args) {

    // TODO 自动生成的方法存根

    int shz[]=new int[100];

    int temp1=0,temp2=0,flag1=0,flag2=0;//分别记录子数列的起始和结束位置

    int sum,te;//表示子数列的和

    Random r=new Random();

    System.out.print("请输入数组元素的个数: ");

    Scanner sc=new Scanner(System.in);

    int a=sc.nextInt();

    System.out.println("--------------------------------" +

    "------------------------------------------");

    System.out.print("产生的随机数序列为:     ");

    for(int i=0;i<a;i++){

    shz[i]=r.nextInt()%10;

    System.out.print(shz[i]+"   ");

    }

    System.out.println("");

    sum=shz[0];

    te=sum;

    for(int i=0;i<a;i++){

    if(te<=0){

    te=0;

    temp1=i+1;

    temp2=i;

    }

    te+=shz[i+1];

    temp2++;

    if(te>sum){

    sum=te;

    flag1=temp1;

    flag2=temp2;

    }

    }

    System.out.print("子数组的组成元素为:    ");

    for(int i=flag1;i<=flag2;i++)

    System.out.print(shz[i]+"    ");

    System.out.println(' '+"子数组和的最大值为:    "+sum);

    }

    }

    4.运行结果

     

    5.编程总结

    ①将整个的程序分而治之,是解决问题的方法。

    ②理清思路很重要,明确编程时每一步要做什么,功能是什么。

    ③做好代码的注释工作,便于理解和检查。

    ④注意编程时代码的规范编写。

    ⑤编程时不应只是用用已经掌握的知识,要到网上多查阅相关内容,扩展知识面,增加知识储备。

    ⑥做好常见形式算法的整理,并熟练运用,锻炼自己的专业能力,温习数据结构中的常见算法。

    ⑦运用新知,熟悉PSP项目计划日志、时间记录日志、缺陷记录日志等方面的内容。

    6.项目计划日志

    姓名:张欢龙        班级:信1305         日期:2015/3/22

    日期

    任务

    听课

    编写程序

    阅读课本

    运动

    日总计

    周五

    90

    0

    10

    60

    160

    周六

    0

    0

    10

    0

    10

    周日

    0

    180

    10

    0

    190

    总计

    90

    180

    30

    60

    360

    7.时间记录日志

    学生:张欢龙                       日期:2015/3/20

    教师:王建民                       课程:软件工程概论

    日期

    开始时间

    结束时间

    中断时间

    净时间

    活动

    备注

    C

    U

    3/20

    1500

    1800

    60

    120

    写作业

    3/21

    娱乐

    3/22

    1100

    1400

    60

    120

    编程

    吃午饭

    1600

    1700

    60

    编程

    8.缺陷记录日志

    学生:  张欢龙

    日期:  2015/3/22

    教员:  王建民

    程序号:1

    日期

    编号

    类型

    引入阶段

    排除阶段

    修复时间

    修复缺陷

    3/22

    1

    逻辑错误

    设计

    编译

    10min

    描述:不能求出子数列的最大值

    2

    习惯问题

    编码

    检查

    5min

    描述:更改不规范的常量和变量的命名

  • 相关阅读:
    BZOJ4269: 再见Xor(线性基)
    Codeforces Round #473 (Div. 2)
    洛谷P3812 【模板】线性基
    CodeChef March Lunchtime 2018 div2
    BZOJ1023: [SHOI2008]cactus仙人掌图(仙人掌dp)
    【Android】Android布局中实现圆角边框
    Java学习系列(一)Java的运行机制、JDK的安装配置及常用命令详解
    mac OSX上eclipse adb无法识别(调试)小米的解决方案
    IOS回调机制——代理,通知中心以及Block
    长沙国储电脑城-学生买电脑-被坑记
  • 原文地址:https://www.cnblogs.com/bdqczhl/p/4357867.html
Copyright © 2011-2022 走看看