这题可以用两种思想来做,一种是DP(动态规划),另一种是DFS(深度优先)。
方法一:DP(动态规划)
dp[ i ][ j ] 代表传到第 i 轮传到 j 有几种方式。 所以dp数组的大小应该为 (k+1)×n (还有个第0轮)。
又因为relation数组中包含的是数组,所以应该遍历的是relation中的数组设为 r ,relation是个图,画出来如下图:
[ 0, 2 ], [ 2, 1 ] 很明显,从 0 到达 1 要经过 2;
所以递推式为:dp[ i ][ relation [ r ][ 1 ]] = dp[ i - 1 ][ relation [ r ][ 0]] + 1
初始化数组dp[0][0] = 1
代码如下:
class Solution:
def numWays(self, n: int, relation: List[List[int]], k: int) -> int:
dp = [[0 for i in range(n)]for i in range(k+1)] ##初始化数组 Tip:里面的循环是列,外面是行
dp[0][0]=1
for i in range(1,k+1):
for r in range(len(relation)):
dp[i][relation[r][1]]+=dp[i-1][relation[r][0]]
return dp[k][n-1]
手写遍历过程如下:
执行通过: