問題描述:給定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...