結對開發求二維數組值最大的子數組(只要連續便可)

結對小組:張永&吳盈盈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爲端點,再尋找到第三大的值得路徑。

把全部的正數都遍歷一遍,獲得的連續的字塊的值就是最大的。

相關文章
相關標籤/搜索