Problem 15 Lattice paths

Starting in the top left corner of a 2×2 grid, and only being able to move to the right and down, there are exactly 6 routes to the bottom right corner.


How many such routes are there through a 20×20 grid?

第一版:最右下角的点,只有两条路径,所以到最右下角的点的路径数等于,那两条路径之和:array[n][n] = array[n-1][n] + array[n-1][n]

如此我们就可以递归求解。

def lattice(array,i,k):
        if i > 0 and k >0:
                array[i][k] =lattice(array,i-1,k) + lattice(array,i,k-1)
        return array[i][k]


def run(n):
        array = [ [ None for i in range(n+1) ] for j in range(n+1) ]
        for i in range(n+1):
                array[0][i] = 1
                array[i][0] = 1
        return lattice(array,n,n)
第二版:第一版中递归求解,从n --> 1 ,中间有大量的重复计算,非常耗时。从下图数据来看,如果我们从1--> n 来填充矩阵数据,我们就可以利用上之前计算结果。

def lattice(n):
        array = [ [ None for i in range(n+1) ] for j in range(n+1) ]
        for i in range(n+1):
                array[0][i] = 1
                array[i][0] = 1
        for i in range(1,n+1):
                for j in range(i,n+1):
                        array[i][j] = array[i-1][j] + array[i][j-1]
                        array[j][i] = array[i][j]
        return array[n][n]

第三版:从数学组合问题来看,在每一条路径中,都会有20次横向和20次纵向移动。如果将横向移动标记为1,纵向移动标记为0,那么问题就变成一个40位数字中有20个1和20个0的组合问题。所以答案就是C(20,40)。
def c(n,m):
        r = 1
        for i in range(n-m+1,n+1):
                r *= i
        for i in range(1,m+1):
                r /= i
        return r

参考:http://mathschallenge.net/full/random_routes

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值