📌  相关文章
📜  国际空间研究组织 | ISRO CS 2013 |问题 35(1)

📅  最后修改于: 2023-12-03 15:23:03.124000             🧑  作者: Mango

国际空间研究组织 | ISRO CS 2013 |问题 35

这是一道考察动态规划的问题。题目描述如下:

有一段路程要走,起点为 (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) 的算法,可以通过本题。