leetcode-----寻找不同路径(动态规划)

在判断一个问题能不能使用动态规划解决时,首先要判断:

1. 每个阶段的状态或值是否能通过上一阶段的状态或值推导出来 (满足)

2. 每个阶段的状态或值一旦决定,是不受后面阶段的状态或值影响的 (满足)

3. 是否有重复子问题的计算 (满足)

4. 是否有边界 (满足)

下面仔细讲上述4个点:

1.。 每个阶段的状态或值是否能通过上一阶段的状态或值推导出来

    由于题目说,机器人只能往右或者往下走。设置  d(i,j)表示 从起点走到 i 列 j 行位置总共的路径数。则d(i,j)可以表示为:

d(i,j) = d(i-1,j)+d(i,j-1)

这就叫做 每个阶段的状态或值可以通过上一阶段的状态或值推导出来 。

2.。 每个阶段的状态或值一旦决定,是不受后面阶段的状态或值影响的

因为题目说明,只能往右,下走,不能往左,上方向走。因此当前阶段是不会受到后面阶段的影响的。

3.。 是否有重复子问题的计算

d(i,j) = d(i-1,j)+d(i,j-1)

满足整个问题,没有特殊例子。所以满足。

4.。是否有边界

d(i,0)和 d(0,j)就是问题的边界。 另外 d(i,0)和 d(0,j)都等于1。

代码:

def uniqePaths(m, n):
    cache = [ [1 for _ in range(m)] if j==0 else [1 if i==0 else None for i in range(m)] for j in range(n)]

    for x in range(1, n):  # 每一行就是一個階段,因為第一行已經知道結果了,所以從第二行開始
        for y in range(1, m):  # 每一個階段內部,因为第一列已经知道了,从第二列开始
            cache[x][y] = cache[x-1][y] + cache[x][y-1]
    return cache,cache[n-1][m-1]

def show(res):
    cache,n = res
    for i in cache:
        print(i)
    print('到达终点的路径总数有:{}'.format(n))
show(uniqePaths(4,5))

输出:

发布了278 篇原创文章 · 获赞 470 · 访问量 82万+

猜你喜欢

转载自blog.csdn.net/u014453898/article/details/104994301
今日推荐