结对开发-返回一个整数数组的最大子数组的和
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 | 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;
}
四、运行截图
以上是关于结对开发-返回一个整数数组的最大子数组的和的主要内容,如果未能解决你的问题,请参考以下文章