問題:陣列a,長度為s,「子段」定義為其中連續的若干個元素,求最大的子段和。(空子段的和定義為0)
思路:設想正在檢查第 i 個元素,已發現的最大和為m,最新選中的子段其和為 t 。
當t <= 0時,若a[i]為正,前面所選子段之和還不如僅選 a[i] 大;若a[i] < 0,反正已經是負數了(還不如選空子段),另選a[i]為新子段也不會更差。
當t > 0時,可以加上 a[i]:增大的話可能是更好的結果,減小也不會拖累 m。
#include #include using namespace std; int max_sub_seq_sum(int const a, int const s) else if(t > m) } return m; } int main() ; assert(max_sub_seq_sum(a, sizeof(a)/sizeof(a[0])) == 0); } ; assert(max_sub_seq_sum(a, sizeof(a)/sizeof(a[0])) == 0); } ; assert(max_sub_seq_sum(a, sizeof(a)/sizeof(a[0])) == 1); } ; assert(max_sub_seq_sum(a, sizeof(a)/sizeof(a[0])) == 3); } ; assert(max_sub_seq_sum(a, sizeof(a)/sizeof(a[0])) == 3); } ; assert(max_sub_seq_sum(a, sizeof(a)/sizeof(a[0])) == 0); } ; assert(max_sub_seq_sum(a, sizeof(a)/sizeof(a[0])) == 0); } ; assert(max_sub_seq_sum(a, sizeof(a)/sizeof(a[0])) == 1); } ; assert(max_sub_seq_sum(a, sizeof(a)/sizeof(a[0])) == 1); } ; assert(max_sub_seq_sum(a, sizeof(a)/sizeof(a[0])) == 2); } ; assert(max_sub_seq_sum(a, sizeof(a)/sizeof(a[0])) == 2); } ; assert(max_sub_seq_sum(a, sizeof(a)/sizeof(a[0])) == 1); } ; assert(max_sub_seq_sum(a, sizeof(a)/sizeof(a[0])) == 1); } ; assert(max_sub_seq_sum(a, sizeof(a)/sizeof(a[0])) == 2); } ; assert(max_sub_seq_sum(a, sizeof(a)/sizeof(a[0])) == 2); } ; assert(max_sub_seq_sum(a, sizeof(a)/sizeof(a[0])) == 28); } }
最大子段和
設a 是n個整數的序列,稱為該序列的子串行,其中1 i j n.子串行的元素之和稱為a的子段和.例如,a 2,11,4,13,5,2 那麼它的子段和是 長度為1的子段和 2,11,4,13,5,2 長度為2的子段和 9,7,9,8,7 長度為3的子段和 5,20,4,6 長度為4的子段和 18,15...
最大子段和
問題表述 n個數 可能是負數 組成的序列a1,a2,an.求該序列 例如 序列 2,11,4,13,5,2 最大子段和 11 4 13 20。1 窮舉演算法 o n3 o n2 2 分治法 將序列a 1 n 從n 2處截成兩段 a 1 n 2 a n 2 1 n 例項 三 最大子段和 問題表述 n個...
最大子段和
再給頂的n個數的陣列中選出連續的若干個數,使得他們的和是最大的,即最大連續自序列和.列如.序列.1 2 3 1 6 5 9 結果 當取子串行 3,1,6,5,9 結果12 我的思路.1.最大連續子串行的開頭是在1.n之中.的最大連續和 2.求出以i,開頭的最大連續和,此時開頭已經確定了,那麼通過列舉...