最大子段和

2021-09-18 08:13:37 字數 2228 閱讀 3761

動態規劃

n個整數組成的序列a[1],a[2],a[3],…,a[n],求該序列如a[i]+a[i+1]+…+a[j]的連續子段和的最大值。當所給的整數均為負數時和為0。

例如:-2,11,-4,13,-5,-2,和最大的子段為:11,-4,13。和為20。

收起

第1行:整數序列的長度n(2 <= n <= 50000)

第2 - n + 1行:n個整數(-10^9 <= a[i] <= 10^9)

輸出最大子段和。
6

-211

-413

-5-2

20
題意:

求某一子串的最大和

樣例是 : 11 + -4 + 13 = 20

在求解 dp[i] 的時候同時求出 最大值

}方法二 、暴力求解(適合資料量較小的情況,這個題目會 t )

// 暴力求解

#include #include #include #include #include #include #include #include typedef long long ll;

using namespace std;

#define memset(a,n) memset(a,n,sizeof(a))

#define inf 0x3f3f3f3f

const int m = 5e4+10;

ll a[m];

int main()

}cout << maxx << endl;

}

如果將所給的序列a[1:n]分為長度相等的兩段子序列a[1:n/2]和a[n/2+1:n],分別求出這兩段子序列的最大子段和,則總序列的最大子段和有三種情況:

1)與前段相同

2)與後段相同

3)跨前後兩段

// 由於求的是跨越兩個子段,所以從中間點位置開始求和

// 切記不能從 [l,mid] 求解

for(int i=mid;i>=l;i--)

for(int i=mid+1; i<=r; i++)

ll ans = 0;

ans = maxx + maxx1;

if(ans < lsum)

ans = lsum;

if(ans < rsum)

ans = rsum;

return ans;

}int main()

最大子段和

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