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

日期&&任务

听课编写程序阅读相关书籍网上查找资料  日总计
周一100 1030140
周二 120 30150
周三 30101050
周四10020  120
周五 120  30150
周六 456010155
周日     
周总计20033580110

765

 

时间记录日志

3/21

日期开始时间结束时间中断时间净时间活动备注
3/2114:0015:5010100听课软件工程上课
 21:0421:  2010阅读书籍《构建之法》
 22:1022: 4030网上查找资料 
3/2221:0021:3020120编写程序结对开发- 子数组之和
 22:  1522:  4530网上查找资料 
3/2319:  2520: 00530编写程序结对开发- 子数组之和
 22:0022: 201010阅读书籍《构建之法》
 22:4022: 50010查找资料 
3/2414:0015:  5010100上课软件工程上课
 18:2618: 5020编写程序结对开发- 子数组之和
3/2514:  0016:  2020120 编写程序结对开发- 子数组之和
 11:2312: 00730网上查找资料 
3/267: 20  9: 3030100阅读书籍阅读《构建之法》
 10: 0011: 001545编写程序结对开发- 子数组之和
 9:  45  9: 55 010网上查找资料 

 

缺陷记录日志

 

日期编号类型引入阶段排除阶段修复时间备注
3/24120编码编译4实参与形参类型对应问题
3/24220编码编译1申请了动态空间未释放
3/2520 编码 编译 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

转载于:https://www.cnblogs.com/qizhonh/p/5322490.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值