给定一个N×N的矩阵垫[] []由非负整数的,任务是找到方法来达到给定的分数m距离细胞(0,0)开始次数和到达细胞(N – 1 , N – 1)仅向下(从 (i, j) 到 (i + 1, j))或向右(从 (i, j) 到 (i, j + 1))。每当到达单元格(i, j)时,总得分由currentScore + mat[i][j] 更新。
例子:
Input: mat[][] = {{1, 1, 1},
{1, 1, 1},
{1, 1, 1}}, M = 4
Output: 0
All the paths will result in a score of 5.
Input: mat[][] = {{1, 1, 1},
{1, 1, 1},
{1, 1, 1}}, M = 5
Output: 6
方法:这个问题可以用动态规划解决。首先,我们需要决定DP的状态。对于每个单元格(i, j)和数字0 ≤ X ≤ M ,我们将存储从单元格(0, 0)到达该单元格的方式数,总分为X 。因此,我们的解决方案将使用 3 维动态规划,两个用于单元格的坐标,一个用于所需的分数值。
所需的递归关系将是,
dp[i][j][M] = dp[i – 1][j][M – mat[i][j]] + dp[i][j-1][M – mat[i][j]]
下面是上述方法的实现:
C++
// C++ implementation of the approach
#include
using namespace std;
#define n 3
#define MAX 30
// To store the states of dp
int dp[n][n][MAX];
// To check whether a particular state
// of dp has been solved
bool v[n][n][MAX];
// Function to find the ways
// using memoization
int findCount(int mat[][n], int i, int j, int m)
{
// Base cases
if (i == 0 && j == 0) {
if (m == mat[0][0])
return 1;
else
return 0;
}
// If required score becomes negative
if (m < 0)
return 0;
if (i < 0 || j < 0)
return 0;
// If current state has been reached before
if (v[i][j][m])
return dp[i][j][m];
// Set current state to visited
v[i][j][m] = true;
dp[i][j][m] = findCount(mat, i - 1, j, m - mat[i][j])
+ findCount(mat, i, j - 1, m - mat[i][j]);
return dp[i][j][m];
}
// Driver code
int main()
{
int mat[n][n] = { { 1, 1, 1 },
{ 1, 1, 1 },
{ 1, 1, 1 } };
int m = 5;
cout << findCount(mat, n - 1, n - 1, m);
return 0;
}
Java
// Java implementation of the approach
class GFG
{
static int n = 3;
static int MAX =30;
// To store the states of dp
static int dp[][][] = new int[n][n][MAX];
// To check whether a particular state
// of dp has been solved
static boolean v[][][] = new boolean[n][n][MAX];
// Function to find the ways
// using memoization
static int findCount(int mat[][], int i, int j, int m)
{
// Base cases
if (i == 0 && j == 0)
{
if (m == mat[0][0])
return 1;
else
return 0;
}
// If required score becomes negative
if (m < 0)
return 0;
if (i < 0 || j < 0)
return 0;
// If current state has been reached before
if (v[i][j][m])
return dp[i][j][m];
// Set current state to visited
v[i][j][m] = true;
dp[i][j][m] = findCount(mat, i - 1, j, m - mat[i][j])
+ findCount(mat, i, j - 1, m - mat[i][j]);
return dp[i][j][m];
}
// Driver code
public static void main(String[] args)
{
int mat[][] = { { 1, 1, 1 },
{ 1, 1, 1 },
{ 1, 1, 1 } };
int m = 5;
System.out.println(findCount(mat, n - 1, n - 1, m));
}
}
/* This code contributed by PrinciRaj1992 */
Python3
# Python3 implementation of the approach
n = 3
MAX = 60
# To store the states of dp
dp = [[[0 for i in range(30)]
for i in range(30)]
for i in range(MAX + 1)]
# To check whether a particular state
# of dp has been solved
v = [[[0 for i in range(30)]
for i in range(30)]
for i in range(MAX + 1)]
# Function to find the ways
# using memoization
def findCount(mat, i, j, m):
# Base cases
if (i == 0 and j == 0):
if (m == mat[0][0]):
return 1
else:
return 0
# If required score becomes negative
if (m < 0):
return 0
if (i < 0 or j < 0):
return 0
# If current state has been reached before
if (v[i][j][m] > 0):
return dp[i][j][m]
# Set current state to visited
v[i][j][m] = True
dp[i][j][m] = (findCount(mat, i - 1, j,
m - mat[i][j]) +
findCount(mat, i, j - 1,
m - mat[i][j]))
return dp[i][j][m]
# Driver code
mat = [ [ 1, 1, 1 ],
[ 1, 1, 1 ],
[ 1, 1, 1 ] ]
m = 5
print(findCount(mat, n - 1, n - 1, m))
# This code is contributed by mohit kumar
C#
// C# implementation of the approach
using System;
class GFG
{
static int n = 3;
static int MAX = 30;
// To store the states of dp
static int [,,]dp = new int[n, n, MAX];
// To check whether a particular state
// of dp has been solved
static bool [,,]v = new bool[n, n, MAX];
// Function to find the ways
// using memoization
static int findCount(int [,]mat, int i,
int j, int m)
{
// Base cases
if (i == 0 && j == 0)
{
if (m == mat[0, 0])
return 1;
else
return 0;
}
// If required score becomes negative
if (m < 0)
return 0;
if (i < 0 || j < 0)
return 0;
// If current state has been reached before
if (v[i, j, m])
return dp[i, j, m];
// Set current state to visited
v[i, j, m] = true;
dp[i, j, m] = findCount(mat, i - 1, j, m - mat[i, j]) +
findCount(mat, i, j - 1, m - mat[i, j]);
return dp[i, j, m];
}
// Driver code
public static void Main()
{
int [,]mat = {{ 1, 1, 1 },
{ 1, 1, 1 },
{ 1, 1, 1 }};
int m = 5;
Console.WriteLine(findCount(mat, n - 1, n - 1, m));
}
}
// This code is contributed by Ryuga
PHP
Javascript
6
时间复杂度: O(N * N * M)
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。