题目:有N个整数的元素的一维数组,求子数组中元素之和中最大的一组(思想:动态规划)

分析:

   设该数组为array[N], 那么对于array[i]该不该在元素之和最大的那个子数组中呢?首先,不如假设array[0..i-1]这个子数组的元素之和最大的子数组已求出,且和为Max,起始编号为start,结束编号为end, temp[i] 记录将array[i]强制加入到array[0..i-1]的元素之和最大的子数组中(比如数组:1, -3] 则temp[2] = -2, 虽然1才是最大和Max);

  如果array[i]加入到array[0..i-1]的元素和最大的子数组中,那么必须:

    temp[i - 1] + array[i] > Max; 确定只有着一个条件么? 非也,如果array[i] > temp[i - 1] + array[i] > Max呢(即Max<0)?这个时候,整个array[0..i]元素组成的子数组中最大和应该变为新的array[i]的值, 且start的新的值为i, end也为i,且temp[i] = array[i];

  如果temp[i-1] + array[i] < Max, 这说明array[i]是一个负数,那么array[0..i]元素组成的子数组中和最大仍未Max, 且start, end都为变化;

  根据上述思想,依次求得array[0..i](i=0, 1, 2...N)的子数组的子数组元素最大和对应的问题结果,

例子:

  如s[6] = {3, -6, 8, 7, -2, 5}, 首先

  对于3:    start = end = 0; Max = 3; temp[0] = 3

  3, -6:     temp[0] + array[1] =  -3 < Max,  此时start = end = 0; Max = 3; temp[1] = temp[0] + array[1] = -3

  3, -6, 8:   Max < temp[1] + array[2] = 5  < array[2],  此时start = end = 2; Max = 8; 由于start的值发生了变化, 此时temp[2]应作新的处理,即temp[2] = array[2] = 8;

  3, -6, 8, 7:  Max < temp[2] + array[3] = 15,  此时start = 2, end  = 3,  temp[3] =  temp[2] + array[3]= 15; Max = 15,

  3, -6, 8, 7, -2:  temp[3] + array[4] < Max, 此时start =2, end = 3, Max = 15(三者不变), temp[4] = temp[3]+ array[4] = 13

  3, -6, 8, 7, -2, 5:  Max < temp[4] + array[5], 此时start = 2(不变) end+=1,即end=5, temp[5] = temp[4] + array[5] = 18 结束

代码(golang):

package main
import (
"fmt"
)
func main() {
array := []int{, -, , , -, }
lenth := len(array);
start, end := ,
var t int
Max := array[start]
temp := make([]int, lenth)
for i := ; i < lenth; i++ {
t = array[i] + temp[i - ]
if t <= array[i] {
start = i
end = i
temp[i] = array[i]
Max = array[i]
} else {
if t > Max {
end = i
Max = t
}
temp[i] = t
}
}
fmt.Println("Max subarray's sum: ", Max, " from ", start, "to ", end)
}

N元数组的子数组之和的最大值的更多相关文章

  1. 求数组的子数组之和的最大值III(循环数组)

    新的要求:一维数组改成循环数组,只是涉及简单算法,只是拿了小数做测试 想法:从文件读取数组,然后新建数组,将文件读取的数组在新数组中做一下连接,成为二倍长度的数组,然后再遍历,将每次遍历的子数组的和存 ...

  2. 求数组的子数组之和的最大值II

    这次在求数组的子数组之和的最大值的条件下又增加了新的约束:  1.要求数组从文件读取.      2.如果输入的数组很大,  并且有很多大的数字,  就会产生比较大的结果 (考虑一下数的溢出), 请保 ...

  3. C#中求数组的子数组之和的最大值

    <编程之美>183页,问题2.14——求子数组的字数组之和的最大值.(整数数组) 我开始以为可以从数组中随意抽调元素组成子数组,于是就有了一种想法,把最大的元素抽出来,判断是大于0还是小于 ...

  4. 求数组的子数组之和的最大值IV

    在之前的基础上又安排了二维数组的,在课上一开始是理解错要求了,简单的以为用循环数组就能解决,但是却忽视了子数组是否能构成矩形,之后课下和同学们讨论,主要是多重遍历,但是我还是没搞明白怎么构成新的二维数 ...

  5. 求二维数组联通子数组和的最大值 (联通涂色) beta!

    算法十分臃肿,效率捉鸡,不知用了多少循环,还有bug...任重道远,编程之美. 思想:按行遍历,找出每行的最大子数组.若行间都联通,行最大子数组相加后,再加上独立的正数.若行间不连通,找出较大子路径, ...

  6. [LeetCode] Minimum Size Subarray Sum 最短子数组之和

    Given an array of n positive integers and a positive integer s, find the minimal length of a subarra ...

  7. lintcode:子数组之和为0

    题目: 子数组之和 给定一个整数数组,找到和为零的子数组.你的代码应该返回满足要求的子数组的起始位置和结束位置 样例 给出[-3, 1, 2, -3, 4],返回[0, 2] 或者 [1, 3]. 解 ...

  8. Minimum Size Subarray Sum 最短子数组之和

    题意 Given an array of n positive integers and a positive integer s, find the minimal length of a suba ...

  9. [LeetCode] 209. Minimum Size Subarray Sum 最短子数组之和

    Given an array of n positive integers and a positive integer s, find the minimal length of a contigu ...

随机推荐

  1. Linux Command Line 解析

    Linux Command Line 解析 0 处理模型 Linux kernel的启动包括很多组件的初始化和相关配置,这些配置参数一般是通过command line进行配置的.在进行后续分析之前,先 ...

  2. Oracle创建用户并赋予权限

    1 CREATE USER username IDENTIFIED BY password; --这个是创建用户(这是最简单的创建语句没有指定表空间) 1 GRANT CREATE SESSION T ...

  3. mysql 支持中文,防止程序乱码的方法

    1. 查看你的mysql的字符设置 mysql> show variables like 'character%'; +--------------------------+---------- ...

  4. 为什么要关闭360云盘:新来的美工嫌我们logo太丑,所以就决定关闭了。这个理由怎么样

    新来的美工嫌我们logo太丑,所以就决定关闭了.这个理由怎么样曾经拥有的不要忘记:不能得到的更要珍惜:属于自己的不要放弃:已经失去的留作回忆.我刚来~~~嘿嘿~~ 久经考验的,忠诚的国际宅男主义战士, ...

  5. Delphi动态事件深入分析(对象方法在调用的时候会传递一个隐含的Self指针,而该指针的值在EAX中。即左边第一个参数)

    Delphi动态事件深入分析 2009-2-7 作者:不得闲核心提示:本实验证明了在类中方法的调用时候,所有的方法都隐含了一个Self参数,并且该参数作为对象方法的第一个参数传递... 首先做一个空窗 ...

  6. CSS3伪类选择器

    first-line   设置首行样式 first-letter 设置首字母样式 before  在某元素前插入内容并设置内容样式 after 在某元素后插入内容并设置内容样式 <!DOCTYP ...

  7. *在Win7中安装JDK1.7并配置环境变量

    安装的过程就不废话了. 下面是环境变量的配置. 1. 配置环境变量 单机右键‘计算机--属性’  2.点击高级系统设置  3.点击‘环境变量’ 4.增加"JAVA_HOME"系统变 ...

  8. 关于Netty4.x中文教程系列更新进度的说明和道歉

    最近一些事情.貌似发现很久没更新教程了.这里和大家说一声对不起.教程5的前半部分差不多年前就写好了.但是由于年前我在的项目组项目进度比较紧张.一直在加班.教程的后半部分就一直没有写.年后由于一些公司人 ...

  9. 每天一个小算法(Shell Sort2)

    希尔排序: 伪代码: input: an array a of length n with array elements numbered 0 to n − 1 inc ← round(n/2) wh ...

  10. TFSAPI

    Team Foundation Server (TFS)工具的亮点之一是管理日常工作项, 工作项如Bug, Task,Task Case等. 使用TFS API编程访问TFS服务器中的工作项, 步骤如 ...