📌  相关文章
📜  使用非零 AND 值到达矩阵末尾的方法数(1)

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

使用非零 AND 值到达矩阵末尾的方法数

有一个给定大小为m x n的矩阵,矩阵中的每个值都是非负整数。现在我们希望从左上角走到右下角,每一步只能向右或向下走,并且路径上的所有数字的AND值(按位与)都不为零。

请你返回从左上角走到右下角的所有路径中,满足上述条件的路径数量。

注意:两个路径的路径捷径是不同的当且仅当该路径通过的格子不同。

示例1:

输入: m = 1, n = 1 0 输出: 0

示例2:

输入: m = 1, n = 2 1 0 输出: 0

示例3:

输入: m = 3, n = 3 1 0 0 0 1 0 0 0 1 输出: 2 解释: 两条不同的路径均可行(1->0->1->0->1和1->0->0->0->1)

思路

首先需要明确AND操作,AND操作的本质是对于同一位置,分别对两个数的二进制表示的每一位做AND运算。AND运算真值表中只有当两个操作数均为1时结果才为1。

计数方式有很多种,可以采用递归、动态规划等多种方法,这里选择使用动态规划来解决。

动态规划

定义一个二维数组dp[m][n],其中dp[i][j]表示从左上角到坐标(i,j)格子的路径数目。

当遍历到位置(i,j)时,需要判断当前格子的数字是否为零。如果为零,dp[i][j]=0,表示该格无法通过AND操作获得非零值,路径数为零。如果当前格子数字为非零值,则需要检查其左边和上方的格子的值是否为零,如果都不为零,则可以从它们中任意一个格子移动到该格,那么该格的路径数就等于它们的路径数之和,即dp[i][j]=dp[i-1][j]+dp[i][j-1]。

最终,dp[m-1][n-1]就是从左上角走到右下角,所有AND值都不为零的路径数量。

代码实现
def uniquePathsWithObstacles(m: int, n: int, obstacleGrid: List[List[int]]) -> int:
    dp = [[0] * n for _ in range(m)]
    dp[0][0] = int(obstacleGrid[0][0] == 0)
    for i in range(1, m):
        if obstacleGrid[i][0] == 0 and dp[i - 1][0] != 0:
            dp[i][0] = 1
    for j in range(1, n):
        if obstacleGrid[0][j] == 0 and dp[0][j - 1] != 0:
            dp[0][j] = 1
    for i in range(1, m):
        for j in range(1, n):
            if obstacleGrid[i][j] == 0 and obstacleGrid[i - 1][j] == 0 and obstacleGrid[i][j - 1] == 0:
                dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
    return dp[m - 1][n - 1]

以上便是本次介绍使用非零 AND 值到达矩阵末尾的方法数的相关内容。