最大子数组1

题目要求:
1.输入一个整数数组,数组中有正数也有负数

2.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和

3.求所有子数组的和的最大值。要求时间复杂度为O(n)


设计思路:
   求解本题方法很多,例如:1.暴力枚举法2.动态规划等
由于枚举法的时间复杂度虽然简单可以运行出结果,但是时间复杂度O(n2)
  下面说一下动态规划方法:
如果我们要用动态规划来解,首先得考虑状态和状态转移方程。如果我们把题述数组看成序列,那么就可以用序列DP来考虑了。
我们不妨考虑一个这样的序列:3,-1,7,-2,4
a[i]表示这个序列的第 i 个元素,dp[i]表示最后一个元素是a[i]的最大连续和,于是:
dp[0] : a[0] ; ( 3)
dp[1] : max(dp[0] + a[1] , a[1]) ; ( 3 )
dp[2] : max(dp[1] + a[2] , a[2]) ; ( 9 )
dp[3] : max(dp[2] + a[3] , a[3]) ; ( 7)
dp[4] : max(dp[3] + a[4] , a[4]) ; ( 11 )
所以:ans = 11 (dp数组的最大值)
于是,我们可以得到状态转移方程:dp[i+1] = max(dp[i]+a[i+1] , a[i+1])
编写代码,我们也可以忽略掉dp数组,直接用一个变量sum来记录 i 之前的最大增量(因为如果这个增量为负,则变为0)

遇到困难:

1.开始用枚举法时:自己的主要难点在于如何将枚举的所有结果都分别存进数组,在进行比较;同时枚举的顺序开始让自己也很纠结;

2.动态规划困难:主要是对动态规划思想的理解与运用;最后再将思想方法变为代码的过程也很麻烦

解决方法:

1.主要是上网查阅相关动态规划的知识,同时看了很多关于动态规划的问题及求解方法;

2.与队友的讨论。

队员:王楗  http://home.cnblogs.com/u/wangjianly/

结组照:

代码如下:

 1 #include<iostream>
 2 #include <algorithm>
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     int Array[100], Arr[100][2];
 8     int    n = 0, j = 1, Max;
 9     cout << "请输入整数数组元素:" << endl;
10     for (;; n++)
11     {
12         cin >> Array[n];
13         if (cin.get() == '\n')
14         {
15             break;
16         }
17     }
18     Arr[0][1] = Array[0];
19     for (; j<n + 1; j++)
20     {
21         Arr[j][0] = max(Arr[j - 1][0], Arr[j - 1][1]);
22         Arr[j][1] = max(Arr[j - 1][1] + Array[j], Array[j]);
23         Max = max(Arr[j][0], Arr[j][1]);
24     }
25     cout << "该数组最大的子数组和为:" << Max << endl;
26     return 0;
27 }

 

运行结果截图如下:

经检验,数组中最大子数组应为【3】【-1】【7】【-2】【4】求和结果为:11

结果正确!

 

经检验,最大子数组应为【5】【-2】【4】,求和结果为7,

结果正确!

 

本次结对开发的项目开发总结如下:

<

项目计划 总 结:             
日期\任务 听课 编写程序 查阅资料 日总计  
星期一 2 0.5 1 3.5  
星期二   1 1 2  
星期三   1 1 2  
星期四 2 0.5 0 2.5  
星期五   0.5 1 1.5  
星期六          
星期日          
周总计 4 3.5 4 11.5  

<

时间记录日志:               
             
日期 开始时间 结束时间 中断时间 静时间 活动 备注
3月21日 19:00 20:50 20 90 分析编程思路  
  14:00 15:50 10 100 上课 软件工程
3月22日 18:20 20:45 25 120 编写程序查阅资料  
3月23日 14:30 16:50 20 120

查阅资料

编写程序

动态规划
3月24日 14:00 15:50 10 100 听课 软件工程
  18:20 18:50   30 编写程序 调试程序寻找错误地方
3月25日 14:10 16:40 60 90 编写程序 调试程序为主,并修改部分功能,规范代码
3月26日 8:00 9:00   60 总结 反思与优化

<

缺陷记录日志:          
         
日期 编号 引入阶段 排除阶段 修复时间&问题描述
3月21日 1 编码 编译 20min,调用函数出错
3月22日 2 编码 编码 0.5小时,方法优化
3月23日 3 编码 编译 20min,数组出错
3月24日 4 编码 编译 10min,代码繁琐
3月25日 5 编码 编译 0.5小时;部分代码不规范
3月26日 6 编码 编译  
posted @ 2016-03-26 09:24  勋爵|X-knight  阅读(122)  评论(1编辑  收藏  举报