结对开发-返回一个整数数组的最大子数组的和
2016-03-26 11:24
225 查看
日期&&任务 | 听课 | 编写程序 | 阅读相关书籍 | 网上查找资料 | 日总计 |
周一 | 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 | 6 | 10 | 阅读书籍 | 《构建之法》 | |
22:10 | 22: 40 | 0 | 30 | 网上查找资料 | ||
3/22 | 21:00 | 21:30 | 20 | 120 | 编写程序 | 结对开发- 子数组之和 |
22: 15 | 22: 45 | 0 | 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 | 4 | 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 | 3 | 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; }
四、运行截图
同组的小伙伴:/article/5561809.html
相关文章推荐
- Orchard源码分析(4.1):Orchard.Environment.CollectionOrderModule类
- yum和apt-get有什么区别
- 类模板的定义及其使用
- Linux telnet简单实用方法
- Linux telnet简单实用方法
- 白话Spring(中级篇)---注解(2)
- 拍照后如何得到真实大小的图片
- 类模板的定义及其使用
- 学习进度条03
- 利用shell脚本操作mysql数据库
- Android 开源框架ViewPageIndicator 和 ViewPager 仿网易新闻客户端Tab标签
- 属性动画
- Mybatis 返回主键
- 科达飞讯语义识别报20021,引擎错误
- ExtJs之ExtJs.Model验证
- 构建之法阅读笔记03
- Rope的简单介绍
- 在iPhone6s系统邮箱添加QQ邮箱
- Abstract class VS Interface2
- 整理php防注入和XSS攻击通用过滤