二維矩陣由左上角到右下角只能向右或向下走全部可能路徑取值之和最大值

二維矩陣由左上角到右下角只能向右或向下走全部可能路徑取值之和最大值,來自網友發的騰訊的一道題目。c++

matrix = [
  [0, 0, 8, 0, 0],
  [0, 0, 0, 9, 0],
  [0, 7, 0, 0, 0],
  [0, 0, 6, 0, 0]
]算法

我用Haskell實現了一下:ide

分三步實現,第一步倒推全部可能路徑,第二步,反向倒推的路徑,獲得正向路徑,若是隻是求和,這一步能夠省略。動畫

第三步,對應座標到具體的路徑中,而後求和,獲取最大值。沒有用到matrix包,只用二維列表來實現。3d

結果地址:http://ideone.com/Ny0GKc  code

不過我不肯定計算的路徑是否正確,因此又寫了一個js的路徑繪製動畫來驗證結果: http://sandbox.runjs.cn/show/l3dlpnrw get

能夠直接把Haskell輸出的結果粘貼到裏面驗證,驗證了一下基本應該沒什麼問題。數學

m X n 矩陣的全部可能路徑,當m,n分別取值:(1,1), (1,2), (2,2), (2,3), (3,3), (3,4), (4,4), (4,5), (5,5), (5,6), (6,6)搜索

獲得的路徑數量依次爲:1,1,2,3,6,10,20,35,70,126,252 看起來好像是某個數列? 也是好多年不寫算法了,居然都推不出路徑對應的數學公式了!搜索到一個公式:(m-1 + n-1)! / (m-1)!(n-1)!   即:m+n-2的階乘 除以 m-1的階乘和n-1的階乘的乘積。後面的應該加小括號括起來:騰訊


我寫了一段Haskell來驗證一下這個公式的結果:

http://ideone.com/Qq824d 



輸出結果爲:

[(1,1),(1,2),(2,2),(2,3),(3,3),(3,4),(4,4),(4,5),(5,5),(5,6),(6,6),(6,7),(7,7),(7,8),(8,8),(8,9),(9,9),(9,10),(10,10),(10,11)]
[1,1,2,3,6,10,20,35,70,126,252,462,924,1716,3432,6435,12870,24310,48620,92378]

還有人用c++寫了一個路徑計算公式:http://code.geeksforgeeks.org/lqxbqN  

我拿來改了一下驗證告終果應該沒錯。

相關文章
相關標籤/搜索