国王的游行

时间:2019-06-10 08:32:29

标签: dynamic dynamic-programming

您将获得尺寸为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

2 个答案:

答案 0 :(得分:1)

简要概述: 这个问题可以通过递归方法调用解决,从n * n开始直到到达国王的目的地0 * 0。

有关此问题的详细说明和解决方案,请在此处查看-> https://www.ngjavascript.com/algorithm-1

答案 1 :(得分:0)

我认为可以使用动态编程解决此问题。我们可以使用dp[i,j]来计算从右下角到i,j位置可以获得的最佳点数。如果这是有效位置(不是超出矩阵或未标记),我们可以基于dp[i,j]i,jdp[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]中。