结对开发——返回一个整数数组中最大子数组的和
Posted 苦甜
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了结对开发——返回一个整数数组中最大子数组的和相关的知识,希望对你有一定的参考价值。
一、题目及题目要求
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 | 30 | 30 | 160 | |
周二 | 120 | 30 | 30 | 180 | |
周三 | 30 | 30 | 10 | 70 | |
周四 | 100 | 20 | 30 | 150 | |
周五 | 120 | 30 | 30 | 180 | |
周六 | 45 | 30 | 10 | 85 | |
周日 | |||||
周总计 | 200 | 335 | 180 | 110 |
825 |
时间记录日志
3/21
日期 | 开始时间 | 结束时间 | 中断时间 | 净时间 | 活动 | 备注 |
3/21 | 14:00 | 15:50 | 10 | 100 | 听课 | 软件工程上课 |
21:04 | 21: 34 | 0 | 30 | 阅读书籍 | 《构建之法》 | |
22:10 | 22: 40 | 0 | 30 | 网上查找资料 | ||
3/22 | 18:00 | 18:30 | 0 | 30 | 阅读书籍 | 《构建之法》 |
19:00 | 21:30 | 20 | 120 | 编写程序 | 结对开发- 子数组之和 | |
22: 15 | 22: 45 | 0 | 30 | 网上查找资料 | ||
3/23 | 19: 25 | 20: 00 | 5 | 30 | 编写程序 | 结对开发- 子数组之和 |
22:00 | 22: 30 | 0 | 30 | 阅读书籍 | 《构建之法》 | |
22:40 | 22: 50 | 0 | 10 | 查找资料 | ||
3/24 | 14:00 | 15: 50 | 10 | 100 | 上课 | 软件工程上课 |
18:26 | 18: 50 | 4 | 20 | 编写程序 | 结对开发- 子数组之和 | |
22:00 | 22:30 | 0 | 30 | 阅读书籍 | 《构建之法》 | |
3/25 | 14: 00 | 16: 20 | 20 | 120 | 编写程序 | 结对开发- 子数组之和 |
11:23 | 12: 00 | 7 | 30 | 网上查找资料 | ||
21:00 | 21:30 | 0 | 30 | 阅读书籍 | 《构建之法》 | |
3/26 | 7: 00 | 7: 30 | 0 | 30 | 阅读书籍 | 阅读《构建之法》 |
10: 00 | 11: 00 | 15 | 45 | 编写程序 | 结对开发- 子数组之和 | |
9: 45 | 9: 55 | 0 | 10 | 网上查找资料 |
缺陷记录日志
日期 | 编号 | 类型 | 引入阶段 | 排除阶段 | 修复时间 | 备注 |
3/24 | 1 | 20 | 编码 | 编译 | 4 | 实参与形参类型对应问题 |
3/24 | 2 | 20 | 编码 | 编译 | 1 | 申请了动态空间未释放 |
3/25 | 3 | 20 | 编码 | 编译 | 7 | 当数组长度为0时,无法正常跳出 |
同组伙伴博客:http://www.cnblogs.com/qizhonh/
工作照:
以上是关于结对开发——返回一个整数数组中最大子数组的和的主要内容,如果未能解决你的问题,请参考以下文章