給定n個數組成的序列,求其中最大子段和,並規定其中如果所有數均為負值的時候,那麼最大欄位和為零。
解決這樣的問題需要用的演算法是:分治法
基本思路:
1. 劃分兩個長度基本相同的子段,得出以下三種情況
2. 如果最大和出現在左邊,就左邊最大子段和為解
3. 如果最大和出現在右邊,就右邊最大子段和為解
4. 如果是最大和在左子段的最右邊的數組成,和右子段的最左邊的數組成,那麼就合併這兩個子段和,得到最終的解
解決這個問題的關鍵:
1. 遞迴法,要熟悉遞迴機制,那麼就比較好理解了
2. 如何把三種情況都很好的計算出來並且合併起來。這也是分治法思想的精要。
下面給出詳細注釋的程式:
#include
#include
using namespace std;
template
t sectionmaxsum(vector& vt, int lindex, int rindex)//index range [1,n] <=> c++index range [0, n-1]
else
t rsubmaxsum = t(0);
t rtempsum = t(0);
for(int i = midindex; irsubmaxsum) rsubmaxsum = rtempsum;
} //情況1,2,3中最大者為問題最終解
sum = lsubmaxsum + rsubmaxsum;
if(sum vd(a, a+18);
//元序列輸出
for(int j=0; j<18; j++)
{ cout<
總結:最終答案是57.7;可以用在整數和浮點數序列中。
NOIP 最大欄位和問題 難點分析和C 實現
給定n個數組成的序列,求其中最大子段和,並規定其中如果所有數均為負值的時候,那麼最大欄位和為零。解決這樣的問題需要用的演算法是 分治法 1.劃分兩個長度基本相同的子段,得出以下三種情況 2.如果最大和出現在左邊,就左邊最大子段和為解 3.如果最大和出現在右邊,就右邊最大子段和為解 4.如果是最大和在...
最大欄位和問題
最大欄位和的思想是將字段分為兩部分,即將陣列平均分為兩部分,那麼最大欄位和的問題分為三種 1 最大欄位和在陣列的第一部分 2 最大欄位和在陣列的第二部分 3 最大欄位和在陣列的 中間 部分,即以陣列的中間數為起點向陣列的兩端擴充套件得到的最大子段和 這個時候就要用到遞迴的思想,最開始就分為這三種情況...
最大欄位和問題
輸入乙個整型陣列,陣列中的乙個或連續多個整數組成乙個子陣列。求所有子陣列的和的最大值。示例1 輸入 nums 2,1,3,4,1,2,1,5,4 輸出 6 解釋 連續子陣列 4,1,2,1 的和最大,為 6。此題很顯然可以用多層for迴圈解決,時間複雜度為o n 2 dp初始化 dp 0 nums ...