連續最大子段和 遍歷,分治,遞迴 C

2021-09-27 10:03:55 字數 1678 閱讀 2294

給定n個整數(可能為負數)組成的序列a[1],a[2],a[3],…,a[n],求該序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。

最簡單的方法, 但時間複雜度太高

int

findgreatestsumofsubarrayway1

(vector<

int> data)}}

return sum;

}

最常見的方法, **略微複雜

int

dealgreatestsum

(vector<

int>

&array,

int begin,

int end)

int mid =

(begin + end)/2

;int leftmax =

dealgreatestsum

(array, begin, mid)

;int rightmax =

dealgreatestsum

(array, mid +

1, end)

;int crossmax =0;

int i;

int sum =0;

int tmpmax = array[mid]

;for

(i = mid; i >= begin; i--)}

crossmax +

= tmpmax;

sum =0;

tmpmax = array[mid +1]

;for

(i = mid +

1; i <= end; i++)}

crossmax +

= tmpmax;

return

max(

max(leftmax, rightmax)

, crossmax);}

//入口

intfindgreatestsumofsubarrayway2

(vector<

int> array)

最快的方法

int

findgreatestsumofsubarrayway3

(vector<

int> data)

else

if(maxsum < tmp)

}return maxsum;

}

#include

#include

#include

#include

using

namespace std;

intmain()

; vector<

int>

data

(array, array +8)

;// cout << findgreatestsumofsubarrayway1(data);

// cout << findgreatestsumofsubarrayway2(data);

// cout << findgreatestsumofsubarrayway3(data);

system

("pause");

return0;

}

最大子段和之分治遞迴法

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 i 1 a j 的子段和的最大值。當所...

3664 最大子段和之分治遞迴法

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

最大子段和之分治法

問題描述 給定乙個陣列,找出其中可以構成最大數的子段,需要注意的是,這個不同於最大子串行求和 最大字段求和 字段必須是連續的 最大子串行求和 子串行只要是包含在原來的序列中即可 舉個例子 1 4 3 1 5 1 4 5 2 求上述的陣列中的最大欄位和,不難得知,最大子段和就是 10 也就是子段4 3...