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

2021-09-27 13:18:17 字數 1299 閱讀 6707

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

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

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

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

sample input

6-2 11 -4 13 -5 -2

sample output

20 11

下面是c語言**

#include#include#define list_size 500000

int count = 0 ;//計數器

typedef struct

sqlist;

void intilist(sqlist *l)/*建立乙個空表*/

void creatlist(sqlist *l , int n)/*建立表*/

}int fenzhi(sqlist *l , int l , int r)/*分治法*/

else

r_b_sum = 0;

r_b_sum_max = 0;

for(j = mid+1 ; j <=r ; j++)/* 從中線向右邊掃瞄 */

sum = l_b_sum_max + r_b_sum_max;

if(l_sum > sum) sum = l_sum;

if(r_sum > sum) sum = r_sum;

}return sum;

}int main()

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

順序表應用7 最大子段和之分治遞迴法 time limit 10 ms memory limit 400 kib submit statistic problem description 給定n 1 n 50000 個整數 可能為負數 組成的序列a 1 a 2 a 3 a n 求該序列如a i a ...

sdut 順序表應用8 最大子段和之動態規劃法

順序表應用8 最大子段和之動態規劃法 time limit 5 ms memory limit 500 kib problem description 給定n 1 n 100000 個整數 可能為負數 組成的序列a 1 a 2 a 3 a n 求該序列如a i a i 1 a j 的子段和的最大值。...

順序表應用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,依此定...