📅  最后修改于: 2023-12-03 15:23:03.124000             🧑  作者: Mango
这是一道考察动态规划的问题。题目描述如下:
有一段路程要走,起点为 (0,0),终点为 (n,n)。在这段路程中有一些洞,不能通过。给定每一个洞的坐标,求从起点到终点的所有路径中,不经过任何一个洞的路径数。答案可能很大,需要对1e9+7取模。
算法分析:
考虑维护一个二维数组 dp,其中 dp[i][j] 表示从起点 (0,0) 到达点 (i,j) 的所有路径中,不经过任何一个洞的路径数。因为只允许往右和往下走,所以递推式为:
if (i, j) 是洞:
dp[i][j] = 0
else:
dp[i][j] = (dp[i - 1][j] + dp[i][j - 1]) % MOD
其中 MOD 为题目中给定的取模数。边界条件为:
dp[0][0] = 1
for j in range(1, n+1):
dp[0][j] = 1 if (0, j) 不是洞 else 0
for i in range(1, n+1):
dp[i][0] = 1 if (i, 0) 不是洞 else 0
最终答案为 dp[n][n]。
代码实现:
MOD = 10**9 + 7
def num_paths(n, holes):
dp = [[0] * (n+1) for _ in range(n+1)]
dp[0][0] = 1
for j in range(1, n+1):
dp[0][j] = dp[0][j-1] if (0, j) not in holes else 0
for i in range(1, n+1):
dp[i][0] = dp[i-1][0] if (i, 0) not in holes else 0
for i in range(1, n+1):
for j in range(1, n+1):
if (i, j) in holes:
dp[i][j] = 0
else:
dp[i][j] = (dp[i-1][j] + dp[i][j-1]) % MOD
return dp[n][n]
n = 5
holes = [(2,1), (1,2), (4,4)]
print(num_paths(n, holes))
输出结果为 8,和题目中的样例一致。
这里提供了一种时间复杂度为 O(n^2) 的算法,可以通过本题。