最大子数组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 编码 编译  
时间: 2024-10-15 03:56:23

最大子数组1的相关文章

软件工程课程作业(四)--返回一个整数数组中最大子数组的和

伙伴链接:http://www.cnblogs.com/haoying1994/ 一.设计思想 本实验要求输入一个正负数混合的整型数组,长度不限,在此数组的所有子数组中找到和最大的数组,并求出相应数组的和,且时间复杂度为O(n).我们在课堂上共同讨论了多种解决方案,这些将在下面可能的解决方案中展示,在听了同学的思路和老师的讲解之后, 我们最终选取了老师课堂上描述的比较简便的思路.如下: 在输入数组的环节,采用for无限循环加if判断截止,直到触发回车键为止,将数组记录到Array中,数组长度记录

lincode.41 最大子数组

最大子数组 描述 笔记 数据 评测 给定一个整数数组,找到一个具有最大和的子数组,返回其最大和. 注意事项 子数组最少包含一个数 您在真实的面试中是否遇到过这个题? Yes 哪家公司问你的这个题? Airbnb Amazon LinkedIn Cryptic Studios Dropbox Apple Epic Systems TinyCo Yelp Hedvig Zenefits Uber Snapchat Yahoo Microsoft Bloomberg Facebook Google T

分治策略 &nbsp; 最大子数组问题

递归式 递归式与分治方法是紧密相关的,因为使用递归式可以很自然地刻画分治算法的运行时间.一个递归式就是一个等式或不等式,它通过更小的输入上的函数值来描述一个函数.例如,在2.3.2节,我们用递归式描述了MERGE-SORT过程的最坏情况运行时间T(n): Θ(1)        若n=1 T(n) =                         (4.1) 2T(n/2)+Θ(n)    若n>1 求解可得T(n)=Θ(nlgn) 递归式可以有很多形式.例如,一个递归算法可能将问题划分为规模

首尾相连求最大子数组和

题目要求: 1.输入一个一维整形数组,数组里有正数也有负数. 2.一维数组首尾相接,象个一条首尾相接带子一样. 3.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.求所有子数组的和的最大值. 设计思想: 遍历数组里面的每一个数将第一个数变为最后一个数,具体算法 a[i-1]=a[i],这样又变成了一个新的一维数组,输出每个数组的最大子数组和,然后比较每个输出的和,找出最大的数 代码: import java.util.Scanner; public class shuzu { p

最大子数组问题

小渣今天再来更新一波,欢迎看众 老爷们尽情喷(批评指导) 何为最大子数组:简言之,就是一数组A[n]中从i到j的连续子序列(i,j均在(0,n)区间内),且不存在另一对(a,b)对使得A[a]+A[a+1]+.....A[b]>A[i]+A[i+1]+...+A[j] 可见:①只有在数组含有负数元素时这个问题才有探讨的价值,否则整个数组本身即是最大子数组了: ②并且,i<=j(最大子数组可能只含有一个元素) ③最大子数组可能不唯一 思路:按照二分法来做,最大子数组两端无非有三种情况: 在左半部

结对开发——返回整数数组最大子数组和2

返回整数数组最大子数组和2 为了实现“敏捷开发”的目的,老师让我们采取“迭代”的方法进行项目的开发,这不,对于周一的求最大子数组和又有了新的要求,如下: 1.延续上次的要求,这里不再赘余… 2.如果数组A[0]……A[j-1]首尾相连,允许A[i-1],……A[n-1],A[0]……A[j-1]之和最大: 3.同时返回最大子数组的位置: 4.要求程序必须能处理1000 个元素,且每个元素是int32 类型的. 一.实验设计思路 首先实现的是数组首尾相连,先存入数组,再将原数组反向存储形成环形数组

课后实验4--返回一个整数数组中最大子数组的和

伙伴链接:http://www.cnblogs.com/chengqiqin07/ 一.设计思想 本实验要求输入一个正负数混合的整型数组,长度不限,在此数组的所有子数组中找到和最大的数组,并求出相应数组的和,且时间复杂度为O(n).我们在课堂上共同讨论了多种解决方案,这些将在下面可能的解决方案中展示,在听了同学的思路和老师的讲解之后, 我们最终选取了老师课堂上描述的比较简便的思路.如下: 在输入数组的环节,采用for无限循环加if判断截止,直到触发回车键为止,将数组记录到Array中,数组长度记

lintcode 中等题:maximum subarray difference 最大子数组差

题目 最大子数组差 给定一个整数数组,找出两个不重叠的子数组A和B,使两个子数组和的差的绝对值|SUM(A) - SUM(B)|最大. 返回这个最大的差值. 样例 给出数组[1, 2, -3, 1],返回 6 注意 子数组最少包含一个数 挑战 时间复杂度为O(n),空间复杂度为O(n) 解题 刚做了数组中两个子数组和的最大值,这一题是求差,感觉上题的求解思想应该是可以用的 A B 分别是两个子数组的和,则: 所以 当A>B 的时候A越大越好 B越小越好 当A<B 的时候B越大越好 A越小越好

最大子数组之和、最大子数组之积、最长递增子序列求法

昨天做爱奇艺笔试题,最后一道编程题是求整型数组最长递增子序列,由于时间关系,没有完全写出来,今天重新来做做这一系列题. <1> 最大子数组之和 首先从最简单的最大子数组之和求取.数组里有正数.负数.零.设包含第 i 个元素的子数组的和为 Sum,则Sum的值为 Sum(i) = Sum(i-1) + arrey[i]; 显然如果arrey[i]<=0,则Sum(i)<=Sum(i-1);则必须把Sum(i)=arrey[i];同时maxSum用来保存Sum最大值.时间复杂度为o(n

(算法)最大子数组和以及最大子矩阵和

题目: 1.给定一数组,求该数组的最大子数组和: 2.给定一矩阵,求该矩阵的最大子矩阵和: 思路: 1.求数组的最大子数组和很简单,可以通过动态规划来实现,假设数组为arr: 假设dp[i]表示从0到i的数组的最大子数组和,那么递推关系式表示为: dp[0]=arr[0]; dp[i]=dp[i-1]>0?dp[i-1]+arr[i]:arr[i] 2.求矩阵的最大子矩阵和看似很难,其实也可以转化为最大子数组和的问题.假设矩阵为matrix 首先,我们求出矩阵每个位置按行叠加的结果,设叠加结果矩