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

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

国际空间研究组织 | ISRO CS 2015 |问题 18

问题描述

一个城市的街道组织成一个方形网格。每个街道的交叉口都被编号为 $(i, j)$,其中 $i$ 和 $j$ 是街道上的位置。一辆车从 $(0, 0)$ 开始,需要去往 $(N, N)$,其中 N 是方格的大小。车只能向右或向下行驶,不能向左或向上。给出限制条件,其中限制条件为不允许车沿特定路线通过。问有多少种方法可以到达目的地。

输入格式

第一行包含整数 $T$,表示测试用例的数量。接下来 $T$ 行每行包含整数 $N$ 和 $M$ 以及 $M$ 个限制条件。

每个限制条件用一个字符串表示,字符串的格式为 "$i$ $j$ $d$",其中 $i$ 和 $j$ 是交叉口的坐标,$d$ 是 'R' 或 'D',分别表示不能向右或向下通过该交叉口。

输出格式

对于每个测试用例,输出一个整数,表示到达 $(N, N)$ 的所有可行路径的数量。

示例

输入

3
3 1 2
1 2 R
3 3 3
1 2 R
2 3 D
3 2 R
2 1 1
1 2 R

输出

2
0
1
分析

此题是一道动态规划(DP)题目,解题步骤如下:

  1. 创建一个 $n+1$ 行 $n+1$ 列的 DP 数组,初始化为 $0$。
  2. 因为车只能向右或向下行驶,所以第一行和第一列的路径数都是 $1$。在 DP 数组中,第一行和第一列的初始化为 $1$。
  3. 从 $(1, 1)$ 开始遍历 DP 数组,对于每一个格子 $(i, j)$,计算到它的路径数,即为从 $(0, 0)$ 到 $(i, j)$ 的路径数之和。
  4. 对于每个限制条件,将 DP 数组中对应格子的值设置为 $0$。
  5. 遍历 DP 数组结束,得到到达 $(n, n)$ 的路径数。
代码
def count_paths(n: int, m: int, restrictions: list) -> int:
    dp = [[0] * (n + 1) for _ in range(n + 1)]
    dp[0][0] = 1
    for i in range(1, n + 1):
        dp[0][i] = 1
        dp[i][0] = 1
      
    for i in range(1, n + 1):
        for j in range(1, n + 1):
            dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
            if [i, j, 'R'] in restrictions:
                dp[i][j - 1] = 0
            if [i, j, 'D'] in restrictions:
                dp[i - 1][j] = 0

    return dp[n][n]

T = int(input())
for i in range(T):
    n, m, k = map(int, input().split())
    restrictions = [input().split() for _ in range(k)]
    print(count_paths(n, m, restrictions))

此代码的时间复杂度是 $O(n^2k)$,其中 $k$ 是限制条件的数量。