C++ 通过DP打印mXn矩阵从左上到右下的所有可能路径

C++ 通过DP打印mXn矩阵从左上到右下的所有可能路径,c++,algorithm,matrix,dynamic,C++,Algorithm,Matrix,Dynamic,我无法使用动态编程“打印mXn矩阵从左上到右下的所有可能路径”。 在大多数站点中,我看到它是通过递归完成的,具有指数级的时间复杂度。 可以提供任何参考或任何链接来创建C++程序来解决这个问题…… 在任何步骤中,您只能在矩阵中向右或向下移动。 正如我所说,我无法理解这意味着我没有开始在这方面的任何事情。。。 谢谢。由于您有指数路径,如果必须打印所有路径,则无法从指数时间运行。另一方面,如果您只想计数,则可以更快地完成 打印所有路径的简单递归解决方案: print_path(x, y, path){

我无法使用动态编程“打印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)) 
现在,对于从(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矩阵的结束值将是相同的。这可以大大降低复杂性。例如,如果矩阵为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

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

std::next_置换
允许在置换上迭代

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()));
std::字符串路径(n-1,'B');
path.resize(n-1+m-1,'R');//路径已排序,将为{B,…,B,R,…,R}
做{

std::难道这是因为大多数问题给人的印象都是家庭作业的垃圾,而你在自己尝试这个问题的时候,却没有把注意力放在你遇到的特定编程问题上。另外,要求在线资源也是特别离题的。这里有助于你把这个问题变成一个可回答的问题。问题描述不够清楚。它假设所有可能的路径都不比最短路径长,不是吗?你卡在哪里了?构建并运行HelloWorld?扩展HelloWorld以获取m和n的输入?通过该矩阵输出任何路径?通过1x1矩阵输出所有路径?通过2x1矩阵输出所有路径?2 x 2?输出通过(n+1)x m矩阵划分所有路径?证明一个程序是动态规划而不是只使用递归函数?你能描述一下你被卡住的地方吗?这是一个家庭作业问题吗?你尝试过什么吗?问题本身不完整-我能从给定的单元格向8个方向移动吗?
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()));