动态规划中的网格移动算法实现

时间:2017-01-17 04:38:41

标签: python algorithm python-2.7 dynamic-programming

处理以下问题,

问题

给定m * n个网格,允许一个向上或向右移动,找到两个网格点之间的不同路径。

我写了两个不同版本的代码,两个都使用动态编程(我测试过它们似乎都返回相同的结果)?

  • 一种算法版本假设如果移动r步骤 对,你提升,我们可以找到(1)正确的r-1步骤的解决方案 你加紧,然后结合最后一个正确的步骤(2),解决方案 r步右,u-1步,然后结合最后一步。

  • 一种算法版本假设如果移动r步骤 对,你迈进,我们可以(1)先向右移动一步,然后 结合r-1步骤的解决方案和你的步骤,(2)移动 首先进行一步,然后与r步骤的解决方案结合使用 和你一步。

Python 2.7中的源代码

from collections import defaultdict
def move_right_up(rights, ups):
    path = defaultdict(list)
    for i in range(1, rights + 1):
        path[(i, 0)].append('r' * i)
    for j in range(1, ups + 1):
        path[(0, j)].append('u' * j)
    for i in range(1, rights+1):
        for j in range(1, ups+1):
            for k in path[(i-1, j)]:
                path[(i,j)].append(k+'r')
            for k in path[(i, j-1)]:
                path[(i,j)].append(k+'u')
    return path[(rights, ups)]

def move_right_up_v2(rights, ups):
    path = defaultdict(list)
    for i in range(1, rights + 1):
        path[(i, 0)].append('r' * i)
    for j in range(1, ups + 1):
        path[(0, j)].append('u' * j)
    for i in range(1, rights+1):
        for j in range(1, ups+1):
            for k in path[(i-1, j)]:
                path[(i,j)].append('r'+k)
            for k in path[(i, j-1)]:
                path[(i,j)].append('u'+k)
    return path[(rights, ups)]

if __name__ == "__main__":
    print sorted(move_right_up(2,3))
    print '============'
    print sorted(move_right_up_v2(2,3))

0 个答案:

没有答案