問題:輸入乙個整形陣列(有正數也有負數),陣列中連續的、乙個或多個元素組成乙個子陣列,每個子陣列都有乙個和。求所有子陣列的和的最大值。
輸入:測試陣列1, -2, 3, 10, -4, 7, 2, -5;
輸出:最大子陣列為3, 10, -4, 7, 2;
輸出最大子陣列的和為18 。
總體思路:
蠻力法是最簡單的實現方法,只要列出陣列所有可能的組合,然後找出其中和最大的組合即可;
蠻力法分三層迴圈實現:
1)第一層迴圈用於固定子陣列的起始位置;
2)第二層迴圈用於確定子陣列的結束位置;
3)第三層迴圈用於子陣列和的計算,從子陣列的頭開始遍歷到其尾,累加起來就是該子陣列的和。
**實現:
1總體思路:分治法的精髓:int forsemax(int *arry,int n,int &_start,int &_end)215
if(sum>_max)
1621}22
}23return _max;//
返回最大和
24 }
1)分--將問題分解為規模更小的子問題;
2)治--將這些規模更小的子問題逐個擊破;
3)合--將已解決的子問題合併,最終得出「母」問題的解;
所以原陣列的最大子陣列求法:
1)分--將原陣列拆分成兩部分,每個部分再拆分成新的兩部分......直到陣列被分得只剩下乙個元素;
2)治--每個小型的陣列找最大子陣列,只有乙個元素的陣列,解就是該元素;
3)合--將兩個小型陣列合併為乙個陣列,其中解有三種可能:
返回值應選最大的;
模組實現:
1難點解說:其中難點在於兩個陣列合併的時候,位於兩個陣列中間位置存在最大和的情況,處理方法為:int divide(int *arry,int l,intr)2
20 }
從中間位置開始,分別向左和向右兩個方向進行操作,通過累加找到兩個方向的最大和,分別為l_max和r_max,因此存在於中間的最大和為(l_max+r_max);
向左的累加操作和向右的累加操作完全一樣,只需要一層迴圈就可以解決問題:
1)初始化l_max、r_max為最小值,命sum=0用於累加;
2)在向左累加的操作中,sum從中點開始向左逐個累加,累加完乙個元素後與l_max相比,l_max保留值較大的乙個;
3)等遍歷完左邊部分l_max的值得以確認,並用同樣的方法確認r_max的值;
4)最後返回(l_max+r_max)的值。
具體**實現如下:
1int middlemax(int *arry,int l,int r,intm)2
13 sum=0;14
for(i=m+1;i//
中線開始向右尋找
1520
return (l_max+r_max);//
返回左右之和
21 }
分治法解決最大子陣列問題
利用分治法解決最大子陣列問題 對給定的陣列得到該陣列中具有最大和的子陣列 對於給定的整數陣列a,求出陣列中具有最大和的子陣列,最大和以及左右下標 思路 採用分治的方法,將陣列分為兩部分,則有最大和的子陣列共有三種情況 在陣列左邊,在陣列右邊,跨越陣列中點 include using namespac...
分治法解決最大子陣列問題
演算法導論中一道很有趣的演算法入門題目,問題是解決最大子陣列的問題,給你乙個陣列,要求你求出其中和最大的連續子陣列,最簡單的思考方式就是暴力求解,對所有的情況都進行組合然後得出最大值,但是這個複雜度是n 為了減少複雜度,演算法導論提供了一種思路,就是用分治法解決最大子陣列的問題 我們首先將要求的陣列...
分治法解決最大子陣列問題
問題 輸入乙個整形陣列 有正數也有負數 陣列中連續的 乙個或多個元素組成乙個子陣列,每個子陣列都有乙個和。求所有子陣列的和的最大值。輸入 測試陣列1,2,3,10,4,7,2,5 輸出 最大子陣列為3,10,4,7,2 輸出最大子陣列的和為18 總體思路 蠻力法是最簡單的實現方法,只要列出陣列所有可...