【问题标题】:Print all possible paths from top left to bottom right of a mXn matrix by DP通过 DP 打印 mXn 矩阵从左上角到右下角的所有可能路径
【发布时间】:2023-03-26 00:41:01
【问题描述】:

我无法使用 Dynamic Programming 来“打印 mXn 矩阵左上角到右下角的所有可能路径”。 在大多数站点中,我看到它是通过递归完成的,具有指数时间复杂度。 任何人都可以为我提供任何参考或任何链接来为这个问题创建一个 c++ 程序...... 在任何步骤中,您只能在矩阵中向右或向下移动。 正如我所说,我无法理解意味着我没有开始任何事情...... 谢谢。

【问题讨论】:

  • 这个问题,作为大多数给人留下家庭作业转储的强烈印象的问题,缺乏关注你在自己尝试这个时遇到的特定编程问题。此外,要求在线资源是特别离题的。这是将其转变为可回答问题的帮助。 meta.stackoverflow.com/questions/334822/…
  • 问题描述不够清楚。它假定所有可能的路径都不长于最短路径,不是吗?
  • 你卡在哪里了?构建和运行 HelloWorld?扩展 HelloWorld 以获取 m 和 n 的输入?通过该矩阵输出任何路径?通过 1x1 矩阵输出所有路径?通过 2x1 矩阵输出所有路径? 2×2?通过 (n+1) x m 矩阵输出所有路径?证明程序是动态编程而不是仅使用递归函数?
  • 你能描述一下你卡在哪里了吗?这是作业问题吗?你试过什么吗?问题本身不完整 - 我可以从给定单元格向所有 8 个方向移动吗?

标签: c++ algorithm matrix dynamic


【解决方案1】:

由于您有指数路径,如果您必须打印所有路径,则无法从指数时间运行。另一方面,如果您只想计数,则可以做得更快。

打印所有路径的简单递归解决方案:

print_path(x, y, path){
    if(x == height && y == width) print(path)
    if(x < height) print_path(x + 1, y, path + (x, y))
    if(y < width)  print_path(x, y + 1, path + (x, y)) 

如果您只想计数,可以使用 DP。假设您从 (0,0) 开始并在 (2,2) 结束。首先要注意,当在 (2,i) 或 (i,2) 中时,您只有一种方法可以到达 (2,2),它是直行的:

0 0 1
0 0 1
1 1 1

现在,对于从 (1,1) 开始的每个 0 元素,从那里开始到终点的路径数是其右侧单元格与底部单元格的总和:

0 0 1        0 0 1        0 3 1        6 3 1
0 2 1   =>   3 2 1   =>   3 2 1   =>   3 2 1
1 1 1        1 1 1        1 1 1        1 1 1

所以你的答案是 6。当你遍历矩阵的所有单元格时。复杂度为 O(n²)。虽然,您可以使用方阵总是对称的事实,并且 NxN 矩阵的最终值将是central binomial coefficient of N。这可以大大降低复杂性。例如,如果你的矩阵是 5x7,你可以推导出矩阵的所有对角线:

0  0 70  0  0  0  0
0  0  0 20  0  0  0
0  0  0  0  6  0  0
0  0  0  0  0  2  0
0  0  0  0  0  0  1

【讨论】:

    【解决方案2】:

    mXn 矩阵从左上角到右下角的路径由m-1 右移和n-1 下移的排列组成。

    std::next_permutation 允许迭代排列

    std::string path(n - 1, 'B');
    path.resize(n - 1 + m - 1, 'R'); // path is sorted and would be {B, .., B, R, .., R}
    
    do {
         std::cout << path << std::endl; // or any other way to print it
    } while (std::next_permutation(s.begin(), s.end()));
    

    Demo

    【讨论】:

      猜你喜欢
      • 2019-09-17
      • 2021-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多