最大欄位和求解方法

2021-09-25 05:41:12 字數 1437 閱讀 6394

問題描述:給定n個整數(可能有負數)組成的序列a1,a2,...,an,求該序列的最大子段和。如果所有整數都是負數,那麼定義其最大子段和為0。

方法一:暴力雙重迴圈破解法

方法二:遞迴分治

在陣列的 center = (right-left)/2+left 位置處分開。形成兩個子陣列。

那麼,最大子段和 可能出現在三個位置:

a,可能出現在【左子陣列】

b,可能出現在【右子陣列】 

c,可能出現在【過center的 中間某部分元素組成的子陣列】。

下面考慮 三種情況的計算方法:

第一種情況: 計算 left 到 center 的最大和,記作 leftsum

第二種情況: 計算從 center+1 到 right的最大和,記作 rightsum

第三種情況: 跨邊界的和。 ;以center為中心分別向兩邊計算和。

a.從 center出發,每次向左邊擴張一步,並且記錄當前的值s1,如果當前的和比上次的和大,就更新s1,一直向左擴張到 位置  left。 

b.從 center+1出發,每次擴張一步,計算當前的和 為s2,如果當前的值比上次的和 大,那麼,就更新s2的值,一直向右擴張到位置right。

c.計算過center的連續值的和,s1+s2的值 sum。 這個就是跨邊界的和。

上面三種情況考慮計算完成後,最後一步就是,比較三個值中的最大值,取最大值就可以了。

**部分:

int maxsubsum(int a, int left, int right) 

cur_t = 0;

for (int i = center+1; i <= right; i++)

int sum = s1 + s2; //sum是過center的連續的最大值

return leftsum > rightsum ? (leftsum > sum ? leftsum : sum) : (rightsum > sum ? rightsum : sum); //比較三者的大小,返回最大的那乙個

}

方法三:動態規劃

**部分:

int maxsubarray(int a, int n) 

return sum;

}

求解最大欄位和

演算法1 窮舉法,對所有的 i,j 對,順序求和a i a j 並比較出較大的和 演算法2 分治法,將陣列分成左右兩半,分別計算左邊的最大和 右邊的最大和 跨邊界的最大和,然後比較其中的最大者。演算法3 動態規劃法 include include 窮舉法求出所有子段和的情況,比較得到較大值 o n ...

最大欄位和

include include include include include using namespace std 最大欄位和問題描述 給定n個整數 可能為負數 組成的序列a 1 a 2 a 3 a n 求該序列如a i a i 1 a j 的子段和的最大值。當所給的整均為負數時定義子段和為0,...

最大欄位和

1049 最大子段和 難度 基礎題 n個整數組成的序列a 1 a 2 a 3 a n 求該序列如a i a i 1 a j 的連續子段和的最大值。當所給的整數均為負數時和為0。例如 2,11,4,13,5,2,和最大的子段為 11,4,13。和為20。input 第1行 整數序列的長度n 2 n 5...