📌  相关文章
📜  非零AND值到达矩阵末尾的方式的数量

📅  最后修改于: 2021-04-22 01:30:55             🧑  作者: Mango

给定一个由非负整数组成的N * N矩阵arr [] [] ,任务是找到以非零AND值开头的到达arr [N – 1] [N – 1]的方法数量。向下或向右移动arr [0] [0] 。每当达到单元格arr [i] [j]时,“ AND”值就会更新为currentVal&arr [i] [j]

例子:

方法:可以使用动态编程解决此问题。首先,我们需要确定DP的状态。对于每个单元格arr [i] [j]和一个数字X ,我们将存储从arr [i] [j]以非零AND到达arr [N – 1] [N – 1]的方式数,其中X是到目前为止的路径的AND值。因此,我们的解决方案将使用3维动态编程,其中两个用于单元格坐标,一个用于X坐标。

所需的递归关系为:

下面是上述方法的实现:

C++
// C++ implementation of the approach
#include 
#define n 3
#define maxV 20
using namespace std;
  
// 3d array to store
// states of dp
int dp[n][n][maxV];
  
// Array to determine whether
// a state has been solved before
int v[n][n][maxV];
  
// Function to return the count of required paths
int countWays(int i, int j, int x, int arr[][n])
{
  
    // Base cases
    if (i == n || j == n)
        return 0;
  
    x = (x & arr[i][j]);
    if (x == 0)
        return 0;
  
    if (i == n - 1 && j == n - 1)
        return 1;
  
    // If a state has been solved before
    // it won't be evaluated again
    if (v[i][j][x])
        return dp[i][j][x];
  
    v[i][j][x] = 1;
  
    // Recurrence relation
    dp[i][j][x] = countWays(i + 1, j, x, arr)
                  + countWays(i, j + 1, x, arr);
  
    return dp[i][j][x];
}
  
// Driver code
int main()
{
    int arr[n][n] = { { 1, 2, 1 },
                      { 1, 1, 0 },
                      { 2, 1, 1 } };
  
    cout << countWays(0, 0, arr[0][0], arr);
  
    return 0;
}


Java
// Java implementation of the approach
class GFG {
  
    static int n = 3;
    static int maxV = 20;
  
    // 3d array to store
    // states of dp
    static int[][][] dp = new int[n][n][maxV];
  
    // Array to determine whether
    // a state has been solved before
    static int[][][] v = new int[n][n][maxV];
  
    // Function to return the count of required paths
    static int countWays(int i, int j,
                         int x, int arr[][])
    {
  
        // Base cases
        if (i == n || j == n) {
            return 0;
        }
  
        x = (x & arr[i][j]);
        if (x == 0) {
            return 0;
        }
  
        if (i == n - 1 && j == n - 1) {
            return 1;
        }
  
        // If a state has been solved before
        // it won't be evaluated again
        if (v[i][j][x] == 1) {
            return dp[i][j][x];
        }
  
        v[i][j][x] = 1;
  
        // Recurrence relation
        dp[i][j][x] = countWays(i + 1, j, x, arr)
                      + countWays(i, j + 1, x, arr);
  
        return dp[i][j][x];
    }
  
    // Driver code
    public static void main(String[] args)
    {
        int arr[][] = { { 1, 2, 1 },
                        { 1, 1, 0 },
                        { 2, 1, 1 } };
  
        System.out.println(countWays(0, 0, arr[0][0], arr));
    }
}
  
// This code contributed by Rajput-Ji


Python3
# Python3 implementation of the approach
n = 3
maxV = 20
  
# 3d array to store states of dp
dp = [[[0 for i in range(maxV)] 
          for i in range(n)] 
          for i in range(n)]
  
# Array to determine whether
# a state has been solved before
v = [[[0 for i in range(maxV)] 
         for i in range(n)] 
         for i in range(n)]
  
# Function to return
# the count of required paths
def countWays(i, j, x, arr):
  
    # Base cases
    if (i == n or j == n):
        return 0
  
    x = (x & arr[i][j])
    if (x == 0):
        return 0
  
    if (i == n - 1 and j == n - 1):
        return 1
  
    # If a state has been solved before
    # it won't be evaluated again
    if (v[i][j][x]):
        return dp[i][j][x]
  
    v[i][j][x] = 1
  
    # Recurrence relation
    dp[i][j][x] = countWays(i + 1, j, x, arr) + \
                  countWays(i, j + 1, x, arr);
  
    return dp[i][j][x]
  
# Driver code
arr = [[1, 2, 1 ],
       [1, 1, 0 ],
       [2, 1, 1 ]]
  
print(countWays(0, 0, arr[0][0], arr))
  
# This code is contributed by Mohit Kumar


C#
// C# implementation of the approach 
using System;
  
class GFG 
{ 
  
    static int n = 3; 
    static int maxV = 20; 
  
    // 3d array to store 
    // states of dp 
    static int[,,] dp = new int[n, n, maxV]; 
  
    // Array to determine whether 
    // a state has been solved before 
    static int[,,] v = new int[n, n, maxV]; 
  
    // Function to return the count of required paths 
    static int countWays(int i, int j, 
                        int x, int [,]arr) 
    { 
  
        // Base cases 
        if (i == n || j == n)
        { 
            return 0; 
        } 
  
        x = (x & arr[i, j]); 
        if (x == 0)
        { 
            return 0; 
        } 
  
        if (i == n - 1 && j == n - 1) 
        { 
            return 1; 
        } 
  
        // If a state has been solved before 
        // it won't be evaluated again 
        if (v[i, j, x] == 1) 
        { 
            return dp[i, j, x]; 
        } 
  
        v[i, j, x] = 1; 
  
        // Recurrence relation 
        dp[i, j, x] = countWays(i + 1, j, x, arr) 
                    + countWays(i, j + 1, x, arr); 
  
        return dp[i, j, x]; 
    } 
  
    // Driver code 
    public static void Main() 
    { 
        int [,]arr = { { 1, 2, 1 }, 
                        { 1, 1, 0 }, 
                        { 2, 1, 1 } }; 
  
    Console.WriteLine(countWays(0, 0, arr[0,0], arr)); 
    } 
} 
  
// This code is contributed by AnkitRai01


输出:
1