最大子段和

2021-08-30 21:48:47 字數 1447 閱讀 3914

給定 n

nn 個整數(可能為負數)組成的序列a[1

],a[

2],a

[3],

…,a[

n]

a[1],a[2],a[3],…,a[n]

a[1],a

[2],

a[3]

,…,a

[n],求該序列如a[i

]+a[

i+1]

+…+a

[j

]a[i]+a[i+1]+…+a[j]

a[i]+a

[i+1

]+…+

a[j]

的子段和的最大值。當所給的整數均為負數時,定義子段和為 000

輸入樣例:

6

-2 11 -4 13 -5 -2

輸出樣例:

20
思路:很明顯用o(n

2)

o(n^2)

o(n2

)可以直接求解,同時也能用o(n

logn

)o(nlogn)

o(nlog

n)的分治方法來解決,方法是將這個序列對半分,然後最大子段和只會出現在左邊序列、右邊序列、跨越中間點的序列,可以解決

當然,最好的辦法還是動態規劃,思路可以順推,既然只需要遍歷一遍,在遍歷的過程中我們只需要判斷將a[i

]a[i]

a[i]

連到a [i

−1

]a[i-1]

a[i−1]

上,或者重新從 i

ii 開始

那麼,我們定義乙個緩衝值,計算從開始那個點到當前這個點的上乙個點 的字段和,若》

0>0

>

0,則加上當前這個點會得到更大的值,反之就重新設定起點

所以我們甚至不需要用到dp陣列,只需要設定乙個dp變數,記錄到當前點的最大值

#includeusing namespace std;

typedef long long ll;

int n, a[10005], dp[10005];

int ans, k;

int main()

printf("%d\n", dp[n-1]);

}

更新一波 當所給的整數均為負數時,仍然求最大欄位和

這裡用到單調佇列來處理,時間複雜度:o(n)

#includeusing namespace std;

typedef long long ll;

const int maxn = 1e5 + 5;

int n, a[maxn], pre[maxn], q[maxn];

int main()

printf("%d\n", ans);

}

最大子段和

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