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

2021-07-23 06:45:39 字數 1654 閱讀 7817

time limit: 10ms

memory limit: 400kb

submit

statistic

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],a[3],a[4],a[5],a[6])=(-2,11,-4,13,-5,-2)時,最大子段和為20。

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

#include

int count=0;

int main()

int fib(int n)

input

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

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

output

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

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

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

example input

6

-2 11 -4 13 -5 -2

example output

20 11

hint

用遞迴的話,就需要把整個順序表平分再平分,直到只剩下乙個元素不能再分,這個題也是這樣,先把整個順序表平分,直到分到不能再分,只剩下兩個資料,左邊乙個,右邊乙個,此時不能再遞迴分了,然後根據這個元素的值是否大於0返回乙個sum,同理右邊也是乙個資料,再把這個和左邊一樣返回,然後記錄下來左邊的最大和值和右邊最大和值,然後對左邊的順序表的值求最大和值,同理右邊也是,找到兩邊最大值相加,然後再與返回單一的元素的和值比較

#include #include using namespace std;

#define maxsize 50010

typedef int element;

typedef struct

sq;int inlist(sq & l)

void creat(sq & l, int n)

int cnt = 0, sum = 0;

int findmax(sq & l, int s, int h) //遞迴查詢最大值

else

tsum = 0;

for(int i = mid + 1; i < h; i++) //對此時回溯順序表右邊部分求最大值

sum = s1 + s2; //把兩邊最大值相加和單個資料比較

if(lsum > sum)

sum = lsum;

if(rsum > sum)

sum = rsum;

}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 ...