【问题标题】:The King's March国王的进行曲
【发布时间】:2019-06-10 08:32:29
【问题描述】:

给你一个尺寸为 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

2

1

【问题讨论】:

  • 您有问题吗?这不是代码编写服务。
  • 我只想要一个逻辑

标签: dynamic dynamic-programming


【解决方案1】:

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

关于这个问题的详细解释和解决方法,请看这里-> https://www.callstacker.com/detail/algorithm-1

【讨论】:

    【解决方案2】:

    我认为这个问题可以使用动态编程来解决。我们可以使用dp[i,j] 来计算从右下角到i,j 位置可以获得的最佳点数。我们可以根据dp[i+1,j]dp[i,j+1]dp[i+1,j+1] 计算dp[i,j],以获得有效的i,j,如果这是有效位置(不在矩阵之外或标记为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]中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-15
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 2022-12-13
      相关资源
      最近更新 更多