順序表應用7 最大子段和之分治遞迴法 分治演算法

2021-10-11 05:46:20 字數 1446 閱讀 8601

給定n(1<=n<=50000)個整數(可能為負數)組成的序列a[1],a[2],a[3],…,a[n],求該序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。當所給的整數均為負數時定義子段和為0,依此定義,所求的最優值為:max,1<=i<=j<=n。例如,當a[1],a[2],a[3],a[4],a[5],a[6])= (-2,11,-4,13,-5,-2)時,最大子段和為20。

注意:本題目要求用分治遞迴法求解,除了需要輸出最大子段和的值之外,還需要輸出求得該結果所需的遞迴呼叫總次數。

#include

int count=0;

intmain()

intfib

(int n)

input

第一行輸入整數n(1<=n<=50000),表示整數序列中的資料元素個數;

第二行依次輸入n個整數,對應順序表中存放的每個資料元素值。

output

一行輸出兩個整數,之間以空格間隔輸出:

第乙個整數為所求的最大子段和;

第二個整數為用分治遞迴法求解最大子段和時,遞迴函式被呼叫的總次數。

sample input

6-2

11-413

-5-2

sample output

20

11

以中間元素為界,將乙個序列分為左邊、右邊。那麼求乙個序列的最大子段和就有三種情況:① 序列左邊的元素具有最大子段和;② 序列右邊元素具有最大子段和;③ 從中間向兩端擴充套件的子段具有最大子段和。

#include

using

namespace std;

int n;

//整數序列中的資料元素個數

int number[

50001];

//整數序列中的資料元素

int max=int_min;

//最大子段和

int count1=0;

//遞迴函式被呼叫的總次數

intmaxsum

(int l,

int r)

else

//整數序列中至少有兩個元素

tempsum=s2=0;

for(

int i=mid+

1;i<=r;i++

)//求從中間元素到最右端的最大子段和s2

sum=s1+s2;

//sum即為從中間向兩端擴充套件的最大子段和

sum=

max(sum,leftsum)

;//上述三種情況求最大值

sum=

max(sum,rightsum)

;//上述三種情況求最大值

}return sum;

}int

main()

分治演算法 順序表應用7 最大子段和之分治遞迴法

problem description 給定n 1 n 50000 個整數 可能為負數 組成的序列a 1 a 2 a 3 a n 求該序列如a i a i 1 a j 的子段和的最大值。當所給的整數均為負數時定義子段和為0,依此定義,所求的最優值為 max,1 i j n。例如,當 a 1 a 2 ...

順序表應用7 最大子段和之分治遞迴法

time limit 10ms memory limit 400kb problem description 給定n 1 n 50000 個整數 可能為負數 組成的序列a 1 a 2 a 3 a n 求該序列如a i a i 1 a j 的子段和的最大值。當所給的整數均為負數時定義子段和為0,依此定...

順序表應用7 最大子段和之分治遞迴法

problem description 給定n 1 n 50000 個整數 可能為負數 組成的序列a 1 a 2 a 3 a n 求該序列如a i a i 1 a j 的子段和的最大值。當所給的整數均為負數時定義子段和為0,依此定義,所求的最優值為 max,1 i j n。例如,當 a 1 a 2 ...