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

一、题目及题目要求

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

三、代码

 

 1 /*2016.3.22 weilihua fengyutong*/
 2 #include<iostream>
 3 #include<iostream>
 4 #include<time.h>
 5 using namespace std;
 6 #define NUM 100000
 7 int DTGH_Sum(int a[],int n) //动态规划法求子段和函数
 8 {
 9     int sum = 0;
10     int *b = (int *) malloc(n * sizeof(int));    //动态为数组分配空间
11     b[0] = a[0];
12     for(int i = 1; i < n; i++)
13     {
14         if(b[i-1] > 0)
15             b[i] = b[i - 1] + a[i];
16         else
17             b[i] = a[i];
18     }
19     for(int j = 0; j < n; j++)
20     {
21         if(b[j] > sum)
22             sum = b[j];
23     }
24     delete []b;        //释放内存
25     return sum;
26 }
27 int main()
28 {
29     int length=0;
30      while (length==NULL||length == 0)//如果数组长度为空或零则请重新输入
31      {
32       cout<<"请输入数组长度:";
33       cin>>length;
34      }
35     int a[NUM];
36     cout<<"输入数组元素:"<<endl;
37     for(int i=0;i<=(length-1);i++)
38     {
39         cin>>a[i];
40     }
41     cout<<"最大子段和:";
42     cout<<DTGH_Sum(a,length)<<endl;
43     return 0;
44     
45 }

 

四、运行截图

五、项目计划日志

 

日期&&任务

听课编写程序阅读相关书籍网上查找资料  日总计
周一100 3030160
周二 1203030180
周三 30301070
周四10020 30 150
周五 120  3030180
周六 45301085
周日     
周总计200335180110

825

 

时间记录日志

3/21

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

 

缺陷记录日志

 

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

 

同组伙伴博客:http://www.cnblogs.com/qizhonh/

工作照:

 

 

 

 

 

 

转载于:https://www.cnblogs.com/a1397240667/p/5322471.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值