最大子段和問題(分治法和動態規劃)

2021-09-23 15:33:42 字數 878 閱讀 6075

什麼是最大子段和,通俗點講:

最大子段和就是給了一些數,然後你從中找了幾個連續的數,這組連續的數的和比任意一組連續的數的和都大,那麼你找的這幾個連續的數的和就是這些數的最大子段和。

通俗的聽不懂你就看這裡:

給定由n個整數(可能為負整數)組成的序列

分治法思想:如果將所給的序列a[1:n]分為長度相等的兩段a[1:n/2]和a[n/2+1:n],分別求出這兩段的最大子段和,則a[1:n]的最大子段和有三種情形:(不敲了。。。直接看圖)

if(sum動態規劃思想:設b[i]是以第i個數結尾的最大子段和,那麼從a[i]的角度來看,b[i]的值只有兩種情況,如果 b[i-1]>0,那麼b[i]=b[i-1]+a[i],否則b[i]=a[i]。(我覺得這個說法比書上的好理解)。

#includeusing namespace std;

int maxsum(int n,int *a)

return sum;

}int main();

cout<

return 0;

}

分治法 動態規劃 最大子段和

題目 給定n個整數 可能為負整數 組成的序列a1,a2,a3,a4,a5,an,求該序列子段和的最大值,子段和 定義為連續 下標遞增 的元素之和。當所有的整數均為負整數時定義其最大子段和為0。如序列為時,最大子段和為20。該問題可以用分治法或者動態規劃來求解。下面給出兩種演算法的思路及 實現 思路 ...

最大子段和問題 蠻力法 分治法 動態規劃法

蠻力法 int maxsum1 int a,int n return maxsum 分治法 int maxsum2 int left,int right,int a sum 0 right max 0 求右邊的最大值 for i center 1 i right i sum right max le...

最大子段和 分治與動態規劃

問題 給定n個整數 可能為負數 組成的序列a 1 a 2 a 3 a n 求該序列如a i a i 1 a j 的子段和的最大值。當所給的整均為負數時定義子段和為0,依此定義,所求的最優值為 max,1 i j n 例如,當 a1,a2,a3,a4,a4,a6 2,11,4,13,5,2 時,最大子...