📅  最后修改于: 2023-12-03 15:07:34.284000             🧑  作者: Mango
一个城市的街道组织成一个方形网格。每个街道的交叉口都被编号为 $(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)题目,解题步骤如下:
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$ 是限制条件的数量。