您将获得尺寸为n x n的棋盘。板右下角有一个国王,标有s。国王需要到达标有e的左上角正方形。其余的正方形用整数p(标记点)或x标记障碍物标记。请注意,国王只能向上,向左和向左(对角线)移动。找到国王可以收集的最高积分以及国王可以采取的此类路径的数量。
输入格式 输入的第一行包含一个整数t。这是测试用例的数量。每个测试用例都包含一个数字n,它表示电路板的尺寸。接下来是n行,每行包含n个以空格分隔的令牌。
输出格式 对于每种情况,请在单独的行中打印可以收集的最大点数和可用路径数,以确保最大值,两个值均用空格分隔。如果e从s不可访问,则打印0 0。
样本输入
3
3
e 2 3
2 x 2
1 2 s
3
e 1 2
1 x 1
2 1 s
3
e 1 1
x x x
1 1 s
样本输出
7 1
4 2
0 0
约束 1 <= t <= 100
2 <= n <= 200
1 <= p <= 9
答案 0 :(得分:1)
简要概述: 这个问题可以通过递归方法调用解决,从n * n开始直到到达国王的目的地0 * 0。
有关此问题的详细说明和解决方案,请在此处查看-> https://www.ngjavascript.com/algorithm-1
答案 1 :(得分:0)
我认为可以使用动态编程解决此问题。我们可以使用dp[i,j]
来计算从右下角到i,j
位置可以获得的最佳点数。如果这是有效位置(不是超出矩阵或未标记),我们可以基于dp[i,j]
,i,j
和dp[i+1,j]
为有效的dp[i,j+1]
计算dp[i+1,j+1]
作为x
),并将在i,j
单元格中获得的点添加到它们中。您应该从右下角到左上角开始计算,逐行并从最后一列开始。
关于数量的方法,您可以添加一个新矩阵ways
并使用它来存储数量。
这是展示此想法的示例代码:
dp[i,j] = dp[i+1,j+1] + board[i,j]
ways[i,j] = ways[i+1,j+1]
if dp[i,j] < dp[i+1,j] + board[i,j]:
dp[i,j] = dp[i+1,j] + board[i,j]
ways[i,j] = ways[i+1,j]
elif dp[i,j] == dp[i+1,j] + board[i,j]:
ways[i,j] += ways[i+1,j]
# check for i,j+1
假设所有职位均有效。
最终结果存储在dp[0,0]
和ways[0,0]
中。