N元陣列的子陣列之和的最大值

2022-08-20 07:45:09 字數 1814 閱讀 6754

題目:有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:    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()

lenth :=len(array);

start, end := 0, 0

var t int

max :=array[start]

temp := make(int

, lenth)

for i := 1; i < lenth; i++

else

temp[i] =t}}

fmt.println(

"max subarray's sum:

", max, "

from

", start, "

to "

, end)

}

子陣列之和的最大值

給定乙個陣列,查詢這個陣列的子陣列的最大和 比如 2,5,3,6,4,8,6 輸出最大和8 分析 假設已經找到乙個子陣列的最大和,這個子陣列是從陣列索引i到索引j。可以用如下式子描述,cur max a i j 對於下乙個數,也就是索引為j 1,這個最大和是否 將a j 1 加入cur max,需要...

子陣列之和的最大值

感謝firo july 2010.06.05。algorithm 1 時間效率為o n n n intmaxsubsequencesum1 const inta,intn return maxsum algorithm 2 時間效率為o n n intmaxsubsequencesum2 const...

求陣列的子陣列之和最大值

題目 乙個有n個整數元素的一維陣列a 0.n 1 這個陣列當然有很多子陣列,那麼子陣列之和最大值是多少?解答 求子陣列之和最大,這裡是連續的子陣列,如果乙個數為負數,陣列之和會減少,記住最大值,只要陣列之和沒有小於0就可以繼續累加,比如,3到 1子陣列之和減小了,但是沒有小於0,可以繼續累加下乙個數...