给定一个由非负整数组成的N * N矩阵arr [] [] ,任务是找到以非零AND值开头的到达arr [N – 1] [N – 1]的方法数量。向下或向右移动arr [0] [0] 。每当达到单元格arr [i] [j]时,“ AND”值就会更新为currentVal&arr [i] [j] 。
例子:
Input: arr[][] = {
{1, 1, 1},
{1, 1, 1},
{1, 1, 1}}
Output: 6
All the paths will give non-zero and value.
Thus, number of ways equals 6.
Input: arr[][] = {
{1, 1, 2},
{1, 2, 1},
{2, 1, 1}}
Output: 0
方法:可以使用动态编程解决此问题。首先,我们需要确定DP的状态。对于每个单元格arr [i] [j]和一个数字X ,我们将存储从arr [i] [j]以非零AND到达arr [N – 1] [N – 1]的方式数,其中X是到目前为止的路径的AND值。因此,我们的解决方案将使用3维动态编程,其中两个用于单元格坐标,一个用于X坐标。
所需的递归关系为:
dp[i][j][X] = dp[i][j + 1][X & arr[i][j]] + dp[i + 1][j][X & arr[i][j]]
下面是上述方法的实现:
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