计算从MxN矩阵的左上到右下的所有路径
在本文中,我们将了解如何计算MxN矩阵从左上到右下的所有路径。
问题
我们需要计算从MxN矩阵的左上角到右下角的所有路径。您可以向下或向右移动。
解
您可以使用递归解决此问题。
递归
1 2 3 4 5 6 7 8 9 10 |
上市 整型 countMatrixPathsRec(整型 [][] 矩阵, 整型 行, 整型 关口){ //基本情况 //如果到达最后一行或最后一列,则只有一条路可走 如果(行==矩阵.长度-1 || 关口==矩阵[0].长度-1){ 返回 1; } 返回 countMatrixPathsRec(矩阵, 行+1, 关口) + countMatrixPathsRec(矩阵, 行, 关口+1); } |
递归可以很好地工作,但是此解决方案的时间复杂度将是指数级的,因为这里有很多重叠的子问题。
我们可以使用动态编程来解决问题。我们赢了’t多次重新计算任何子问题。
动态编程
这是用于动态编程解决方案的简单算法。
- 用矩阵初始化数组dp’的尺寸。一旦到达右下角,此数组将为我们提供最终计数。
- 用1填充第一行,因为您可以从一个方向到达此处(向右移动)
- 也请在第一列中填入1,因为您可以从一个方向到达此处(向下移动)。
- 遍历所有其他行和列并使用公式 dp = dp [i-1] [j] + dp [i] [j-1],因为您可以从两个方向到达此处(向右或向下)
- 返回 dp [matrix.length-1] [matrix [0] .length-1]
这是该算法的示意图。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
上市 整型 countMatrixPathsDynamicProgramming(整型 [][] 矩阵){ 整型 dp [][] = 新 整型[矩阵.长度][矩阵[0].长度]; //第一行的路径数将为1,因为您只能沿一个方向移动 对于 (整型 i = 0; i <dp .长度 ; i++) { dp [0][i] = 1; } //第一列的路径数将为1,因为您只能在一个方向上移动 对于 (整型 i = 0; i <dp .长度 ; i++) { dp [i][0] = 1; } 对于 (整型 i = 1; i <dp .长度 ; i++) { 对于 (整型 j = 1; j <dp .长度 ; j++) { dp [i][j] = dp [i-1][j] + dp [i][j-1]; } } 返回 dp [矩阵.长度-1][矩阵[0].长度-1]; } |
这是完整的程序,用于计算从MxN矩阵的左上到右下的所有路径。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
包 组织.Arpit.爪哇2blog; 上市 类 CountMatrixPaths { 上市 静态的 虚空 主要(串[] args) { CountMatrixPaths cmp=新 CountMatrixPaths(); 整型[][] 矩阵= { {1,2,3}, {4,5,6}, {7,8,9} }; 整型 totalPathsRec = cmp.countMatrixPathsRec(矩阵,0,0); 系统.出.打印(“使用递归到达左上到右下的总路径:”+totalPathsRec); 整型 totalPaths = cmp.countMatrixPathsDynamicProgramming(矩阵); 系统.出.打印(“使用DP到达左上至右下的总路径:”+totalPaths); } 上市 整型 countMatrixPathsRec(整型 [][] 矩阵, 整型 行, 整型 关口){ //基本情况 //如果到达最后一行或最后一列,则只有一条路可走 如果(行==矩阵.长度-1 || 关口==矩阵[0].长度-1){ 返回 1; } 返回 countMatrixPathsRec(矩阵, 行+1, 关口) + countMatrixPathsRec(矩阵, 行, 关口+1); } 上市 整型 countMatrixPathsDynamicProgramming(整型 [][] 矩阵){ 整型 dp [][] = 新 整型[矩阵.长度][矩阵[0].长度]; //第一行的路径数将为1,因为您只能沿一个方向移动 对于 (整型 i = 0; i <dp .长度 ; i++) { dp [0][i] = 1; } //第一列的路径数将为1,因为您只能在一个方向上移动 对于 (整型 i = 0; i <dp .长度 ; i++) { dp [i][0] = 1; } 对于 (整型 i = 1; i <dp .长度 ; i++) { 对于 (整型 j = 1; j <dp .长度 ; j++) { dp [i][j] = dp [i-1][j] + dp [i][j-1]; } } 返回 dp [矩阵.长度-1][矩阵[0].长度-1]; } } |
这是上述程序的输出。
使用DP到达左上至右下的总路径:6
那’所有关于计数从MxN矩阵的左上到右下的所有路径。