处理以下问题,
问题,
给定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))