結對小組:張永&吳盈盈html
每到週一,建民老師都會在課堂上留下一個引人深思的問題。題目:求一個二維數組中子數組和最大的子數組,子數組只要由連續的元素組成便可。算法
例如:數組
對這個題目的分析:htm
1.首先應該對個二維數組遍歷一遍,求出二維數組中全部的正數,並記錄每一個正數所對應的位置(行號和列號);blog
2.對遍歷到的全部的正數進行排序(由大到小),要求只要連續的字塊的和的最大值,首先從二維數組中最大的正數(設爲a)開始找。找a到次大的正數(設爲b)之間的一條路徑,這條路徑知足的條件是,路徑上全部元素的和加起來的絕對值要小於b;排序
這個路徑不必定是最近的。class
下面的問題就轉到了求兩點之間的最短路徑問題,咱們能夠藉助A*算法來計算。遍歷
A*算法的僞代碼:im
建立兩個表,OPEN表保存全部已生成而未考察的節點,CLOSED表中記錄已訪問過的節點。 算起點的估價值; 將起點放入OPEN表; while(OPEN!=NULL) { 從OPEN表中取估價值f最小的節點n; if(n節點==目標節點){ break; } for(當前節點n 的每一個子節點X) { 算X的估價值; if(X in OPEN) { if( X的估價值小於OPEN表的估價值 ){ 把n設置爲X的父親; 更新OPEN表中的估價值; //取最小路徑的估價值 } } if(X inCLOSE) { if( X的估價值小於CLOSE表的估價值 ){ 把n設置爲X的父親; 更新CLOSE表中的估價值; 把X節點放入OPEN //取最小路徑的估價值 } } if(X not inboth){ 把n設置爲X的父親; 求X的估價值; 並將X插入OPEN表中; //尚未排序 } }//end for 將n節點插入CLOSE表中; 按照估價值將OPEN表中的節點排序; //其實是比較OPEN表內節點f的大小,從最 小路徑的節點向下進行。 }//end while(OPEN!=NULL) 保存路徑,即 從終點開始,每一個節點沿着父節點移動直至起點,這就是你的路徑
A*算法詳解參考http://www.cnblogs.com/kanego/archive/2011/08/30/2159070.html二維數組
3.而後在以a,b爲端點,再尋找到第三大的值得路徑。
把全部的正數都遍歷一遍,獲得的連續的字塊的值就是最大的。