給定由n個整數(可能為負數)組成的序列 a1 , a2 , ... , an
求該序列形如 for k = i to j : sum = sum + ak : next k
的子段和的最大值.
問題有很多解法,而用動態規則解是最簡單的。
設b[j] = max(1<=i<=j) , 1 <= j <= n
則b[j] = max , 1 <= j <= n
動態規則問題最重要的是得出
遞迴式而這正是問題的難點,至少對我來說比較難
分析問題,找到問題是否有最優子結構,由最優子結構的性質得出
遞迴式#include "iostream.h"
int maxsum( int n , int *a , int &besti , int &bestj )
else
if( t > sum )
}return sum;
}void main()
;int n = 6;
int bi , bj;
int best = maxsum( n , a , bi , bj );
cout<<"最大子段和為:"< cout<<"起點 "< }參考資料: 《計算機演算法分析與設計》電子工業出版社 程式有所改進 問題 給定n個整數 可以為負數 的序列 a1 a2 an 求其最大子段和 連續的某個子串 分析 蠻力法的話,o n2 分治法,將序列分為左右兩部分分別求最大子段和,從分界點開始向兩邊分別找最大子段和再合併,取最大即可。複雜度遞推式 t n 2t n 2 o n o nlogn 動態規劃,最優子結構的... 問題描述 給定由n個整數 包含負整數 組成的序列a1,a2,an,求該序列子段和的最大值。當所有整數均為負值時定義其最大子段和為0。依此定義,所求的最優值為 例如,當 a1,a2 a3 a4 a5 a6 2,11,4,13,5,2 時,最大子段和為 11 4 13 20 1 最大子段和問題的簡單演算... 有一由n個整陣列成的序列a 求該序列如 a i a i 1 a j 的子段和的最大值。如果序列中全部是負數則最大子段和為0,依此定義,所求的最優值max,1 i j n。輸入 n 序列的長度 序列值輸出 最大子段和 例如 輸入 6 2,11,4,13,5,2 輸出 20演算法可通過動態規劃求解 我們... 問題描述 給定由n個整數 包含負整數 組成的序列a1,a2,an,求該序列子段和的最大值。當所有整數均為負值時定義其最大子段和為0。依此定義,所求的最優值為 例如,當 a1,a2 a3 a4 a5 a6 2,11,4,13,5,2 時,最大子段和為 11 4 13 20 1 最大子段和問題的簡單演算... 問題 給定有n個整數 包含負整數 組成的序列a1,a2,a3,an,求該序列子段和的最大值。注意 當所有整數均為負值時,定義其最大欄位和為0 由bj的定義 bj是1到j位置的最大子段和 易知,當bj 1 0時bj bj 1 aj,否則bj aj。則計算bj的動態規劃遞迴式 bj max,1 j n。...動態規劃 最大子段和問題
動態規劃之最大子段和問題
動態規劃之最大子段和問題
動態規劃之最大子段和問題
4 4最大子段和問題(動態規劃)