最大子数组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 | 编码 | 编译 |