结对开发-返回一个整数数组的最大子数组的和

Posted L养一只猫

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了结对开发-返回一个整数数组的最大子数组的和相关的知识,希望对你有一定的参考价值。

日期&&任务

听课 编写程序 阅读相关书籍 网上查找资料   日总计
周一 100   10 30 140
周二   120   30 150
周三   30 10 10 50
周四 100 20     120
周五   120    30 150
周六   45 60 10 155
周日          
周总计 200 335 80 110

765

 

时间记录日志

3/21

日期 开始时间 结束时间 中断时间 净时间 活动 备注
3/21 14:00 15:50 10 100 听课 软件工程上课
  21:04 21:  20 10 阅读书籍 《构建之法》
  22:10 22: 40 30 网上查找资料  
3/22 21:00 21:30 20 120 编写程序 结对开发- 子数组之和
  22:  15 22:  45 30 网上查找资料  
3/23 19:  25 20: 00 5 30 编写程序 结对开发- 子数组之和
  22:00 22: 20 10 10 阅读书籍 《构建之法》
  22:40 22: 50 0 10 查找资料  
3/24 14:00 15:  50 10 100 上课 软件工程上课
  18:26 18: 50 20 编写程序 结对开发- 子数组之和
3/25 14:  00 16:  20 20 120  编写程序 结对开发- 子数组之和
  11:23 12: 00 7 30 网上查找资料  
3/26 7: 20   9: 30 30 100 阅读书籍 阅读《构建之法》
  10: 00 11: 00 15 45 编写程序 结对开发- 子数组之和
  9:  45   9: 55  0 10 网上查找资料  

 

缺陷记录日志

 

日期 编号 类型 引入阶段 排除阶段 修复时间 备注
3/24 1 20 编码 编译 4 实参与形参类型对应问题
3/24 2 20 编码 编译 1 申请了动态空间未释放
3/25 20  编码  编译  7 当数组长度为0时,无法正常跳出

 

一、题目及题目要求

 

1、输入一个整型数组,数组里有正数也有负数;

 

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

 

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

 

二、设计思路

 

 一开始想用枚举法完成程序,即把所有子数组都算出来。但因为从第一个算一遍,再从第二个算一遍,用到双重循环显然不满足时间复杂度的要求。后来在同学指导下了解到动态规划解决此类问题符合要求。所以自学了动态规划的内容,http://baike.baidu.com/link?url=-XGpWNVCf5_LA6ox8XjXGRcYjP0sMoO88mERMNd7T7keBTHx4cTHrmgkTjOkJLxHsV5bPjbnMPb9NeE_FvTVPq(百度百科动态规划)。

 

以下本题算法:

 

抽象为数学模型即给定由n个整数(可能为负整数)组成的序列a1, a2,…, an, 求该序列形如            的子段和的最大值。当所有整数均为负整数时定义其最大子段和为0。依此定义,所求的最优值为:

 

1)分析问题最优解的结构

 

 

 

若记b[j]=             , 1≤i≤n,则所求最大子段和为:

 

由b[j]的定义易知,当b[j-1]>0时,   b[j]=b[j-1]+a[j], 否则, b[j]=a[j]。

 

2)建立递归方程

 

b[j]=max{b[j-1]+a[j], a[j]}, 1≤j≤n

三,代码

 

/*2016.3.22 weilihua fengyutong*/
#include<iostream>
#include<iostream>
#include<time.h>
using namespace std;
#define NUM 100000
int DTGH_Sum(int a[],int n) //动态规划法求子段和函数
{
    int sum = 0;
    int *b = (int *) malloc(n * sizeof(int));    //动态为数组分配空间
    b[0] = a[0];
    for(int i = 1; i < n; i++)
    {
        if(b[i-1] > 0)
            b[i] = b[i - 1] + a[i];
        else
            b[i] = a[i];
    }
    for(int j = 0; j < n; j++)
    {
        if(b[j] > sum)
            sum = b[j];
    }
    delete []b;        //释放内存
    return sum;
}
int main()
{
    int length=0;
     while (length==NULL||length == 0)//如果数组长度为空或零则请重新输入
     {
      cout<<"请输入数组长度:";
      cin>>length;
     }
    int a[NUM];
    cout<<"输入数组元素:"<<endl;
    for(int i=0;i<=(length-1);i++)
    {
        cin>>a[i];
    }
    cout<<"最大子段和:";
    cout<<DTGH_Sum(a,length)<<endl;
    return 0;
    
}

四、运行截图

同组的小伙伴:http://www.cnblogs.com/a1397240667/p/5294473.html

以上是关于结对开发-返回一个整数数组的最大子数组的和的主要内容,如果未能解决你的问题,请参考以下文章

返回一个二维整数数组中最大子数组的和

课堂练习;返回一个二维数组中最大子数组的和

返回一个二维整数数组中最大子数组的和(二人结对)

返回一个整数数组中最大子数组的和。(二人结对编程)

返回一个整数数组中最大子数组的和。(二人结对编程)

求一维数组的最大子数组1(结对开发)