C++程序中矩阵从上到下再返回的最大路径和


在这个问题中,我们给定一个大小为 nXm 的矩阵 mat[][]。我们的任务是创建一个程序来查找矩阵中从上到下再返回的最大路径和。

问题描述 − 我们需要找到从左上角到右下角,然后再返回的最大路径和。

有效移动

From mat[0][0] to mat[n−1][m−1]: Right (mat[i][j] to mat[i][j+1]) and Down (mat[i][j] to mat[i+1][j]).
From mat[n−1][m−1] to mat[0][0]: left (mat[i][j] to mat[i][j−1]) and up (mat[i][j] to mat[i−1][j]).

有一点很重要,这两条路径不能相同。两条路径中应该有一个或多个元素不同。

让我们举个例子来理解这个问题,

输入

mat[][] = {
   {1, 2, 4},
   {3, 0, 1},
   {5, −1, −1}
}

输出

15

解释

Path from mat[0][0] to mat[n−1][m−1]: 1 + 3 + 5 − 1 − 1 = 7
Path from mat[n−1][m−1] to mat[0][0]: + 1 + 4 + 2 + 1 = 8
Sum = 7 + 8 = 15

解决方案方法

为了解决这个问题,我们需要找到两条路径(一条从 mat[0][0] 到 mat[n−1][m−1],另一条从 mat[n−1][m−1] 到 mat[0][0])。但更好的做法是找到从 mat[0][0] 到 mat[n− 1][m−1] 的两条不同路径的总和。为此,我们将从 mat[0][0] 开始,通过找到下一个最有希望的元素来找到两条路径,直到它们到达路径的末尾。然后返回两者的总和。我们需要检查的一件事是查找某个单元格是否不在两条路径上,因为需要有两条不同的路径。

示例

程序说明我们解决方案的工作原理,

 在线演示

#include <bits/stdc++.h>
using namespace std;
#define row 3
int CalcNodeDiff(int mat[][row], int path1x, int path1y, int path2x, int
path2y) {
   if (path1x == path2x && path1y == path2y) {
      return mat[path1x][path1y];
   }
   return mat[path1x][path1y] + mat[path2x][path2y];
}
int calcMaxPathSumOfMat(int mat[][row], int path1x, int path1y, int
path2x, int n) {
   int pathSumDP[5][5][5];
   memset(pathSumDP, −1, sizeof(pathSumDP));
   int path2y = path1x + path1y − path2x;
   int maxPathSum = −10000;
   if (path1x >= n || path2x >= n || path1y >= row || path2y >= row)
   return 0;
   if (pathSumDP[path1x][path1y][path2x] != −1)
      return pathSumDP[path1x][path1y][path2x];
   maxPathSum = max(maxPathSum,
   calcMaxPathSumOfMat(mat, path1x + 1, path1y, path2x + 1, n) +
   CalcNodeDiff(mat, path1x, path1y, path2x, path2y));
   maxPathSum = max(maxPathSum,
   calcMaxPathSumOfMat(mat, path1x, path1y + 1, path2x, n) +
   CalcNodeDiff(mat, path1x, path1y, path2x, path2y));
   maxPathSum = max(maxPathSum,
   calcMaxPathSumOfMat(mat, path1x, path1y + 1, path2x + 1, n) +
   CalcNodeDiff(mat, path1x, path1y, path2x, path2y));
   maxPathSum = max(maxPathSum,
   calcMaxPathSumOfMat(mat, path1x + 1, path1y, path2x, n) +
   CalcNodeDiff(mat, path1x, path1y, path2x, path2y));
   pathSumDP[path1x][path1y][path2x] = maxPathSum;
   return maxPathSum;
}
int main() {
   int n = 3;
   int mat[n][row] = {
      { 1, 2, 4 },
      { 3, 0, 1 },
      { 5, −1, −1 }
   };
   cout<<"The maximum sum path in a matrix from top to bottom and back is "<<calcMaxPathSumOfMat(mat, 0, 0, 0, n);
   return 0;
}

输出

The maximum sum path in a matrix from top to bottom and back is 15

更新于: 2020年12月9日

216 次浏览

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告