c++ - 通过 DP 打印 mXn 矩阵从左上角到右下角的所有可能路径
问题描述
我无法通过使用动态编程“打印从 mXn 矩阵的左上角到右下角的所有可能路径” 。在大多数站点中,我看到它是通过递归完成的,具有指数时间复杂度。任何人都可以为我提供任何参考或任何链接来为这个问题创建一个 c++ 程序......您可以在任何步骤中仅向右或向下移动矩阵。正如我所说,我无法理解这意味着我没有开始任何事情......谢谢。
解决方案
由于您有指数路径,因此如果您必须打印所有这些路径,则无法从指数时间开始运行。另一方面,如果你只是想计数,它可以做得更快。
打印所有路径的简单递归解决方案:
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 矩阵的最终值将是 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
推荐阅读
- python - VGG16 网络验证准确度
- python - 带有数据框的键值
- sql - SQL Server 2019 - 添加日期和时间组件
- javascript - 我正在尝试用 JavaScript 编写 Discord 机器人,但遇到了问题
- bash - 在以下情况下,/bin/bash $0 $0 在第 5 行做什么?
- python - 有概率的简单突变
- c# - Entity Framework C# Table 未使用 add 方法更新数据
- sql-server - 如何按月划分金额和订单?sql服务器
- c++ - 输入数据的时间复杂度
- python - TensorFlow 2.x:无法以 h5 格式保存训练模型(OSError:无法创建链接(名称已存在))