二维矩阵由左上角到右下角只能向右或向下走全部可能路径取值之和最大值,来自网友发的腾讯的一道题目。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来验证一下这个公式的结果:
输出结果为:
[(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
我拿来改了一下验证告终果应该没错。