題目:有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 mainimport (
"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,可以繼續累加下乙個數...