最大子段和

2021-08-26 11:17:13 字數 833 閱讀 9627

我們令乙個陣列f,f[i]表示前i個元素能組成的最大和。如果f[i-1]大於零,則不管a[i]的情況,f[i-1]都可以向正方向影響a[i],因此可以將a[i]加在f[i-1]上。如果f[i-1]小於零,則不管a[i]再大,都會產生負影響,因此我們還不如直接令f[i]=a[i]。因此狀態轉移方程就在這裡。我們只需在f中掃瞄一次,找到最大的值就是最大子段的和。

int lss_dp(int a) //求最大子段和,動態規劃,o(n)

int f[101], n = a[0], max = -200000000; //f[i]表示第 i 個數能構成的最大和, max 表示當前所有中的最大和

f[1] = a[1];

for (int i = 2; i <= n; i++)

if (f[i - 1] > 0) //如果第 i 個數後面乙個數能構成的最大子段和大於 0

f[i] = f[i - 1] + a[i]; //大於就將第 i 個數加入其中

else

f[i] = a[i]; //否則第 i 個數自己組成乙個最大子串行

if (f[i] > max) //更新最大值

max = f[i];

return max;

實際上不需要f陣列,只用乙個變數表示即可

int getsum(int s,int n){

int sum =s[0],max = s[0];

for(int i=1;iif(sum>0)

sum = sum+s[i];

else{

sum = s[i];

if(sum>max)

max = s[i];

return max;

最大子段和

設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,開頭的最大連續和,此時開頭已經確定了,那麼通過列舉...