用 C++ 查找给定约束矩阵中最长路径


假设我们有一个 n 阶方阵。它有所有不同的元素。因此,我们必须找到最长的路径,这样路径上的所有单元格按升序排列,且差值为 1。我们从一个单元格可以移动到四个方向。左、右、上、下。因此,如果矩阵如下:

129
538
467

那么输出将是 4。因为最长路径是 6→7→8→ 9

为了解决这个问题,我们将遵循这个思路。我们将计算以每个单元格开头最长的路径。一旦我们获得了所有单元格最长的路径,我们返回所有最长路径的最大值。

此方法中一个重要的观察是许多重叠的子问题。因此,可以使用动态规划来解决该问题。在这里,我们将使用查找表 dp[][] 来检查某个问题是否已经解决。

示例

#include <iostream>
#define n 3
using namespace std;
int getLongestPathLengthUtil(int i, int j, int matrix[n][n], int table[n][n]) {
   if (i < 0 || i >= n || j < 0 || j >= n)
   return 0;
   if (table[i][j] != -1)
      return table[i][j];
   int x = INT_MIN, y = INT_MIN, z = INT_MIN, w = INT_MIN;
   if (j < n - 1 && ((matrix[i][j] + 1) == matrix[i][j + 1]))
      x = 1 + getLongestPathLengthUtil(i, j + 1, matrix, table);
   if (j > 0 && (matrix[i][j] + 1 == matrix[i][j - 1]))
      y = 1 + getLongestPathLengthUtil(i, j - 1, matrix, table);
   if (i > 0 && (matrix[i][j] + 1 == matrix[i - 1][j]))
      z = 1 + getLongestPathLengthUtil(i - 1, j, matrix, table);
   if (i < n - 1 && (matrix[i][j] + 1 == matrix[i + 1][j]))
      w = 1 + getLongestPathLengthUtil(i + 1, j, matrix, table);
      return table[i][j] = max(x, max(y, max(z, max(w, 1))));
}
int getLongestPathLength(int matrix[n][n]) {
   int result = 1;
   int table[n][n];
   for(int i = 0; i < n; i++)
   for(int j = 0; j < n; j++)
   table[i][j] = -1;
   for (int i = 0; i < n; i++) {
      for (int j = 0; j < n; j++) {
         if (table[i][j] == -1)
         getLongestPathLengthUtil(i, j, matrix, table);
         result = max(result, table[i][j]);
      }
   }
   return result;
}
int main() {
   int mat[n][n] = { { 1, 2, 9 },
   { 5, 3, 8 },
   { 4, 6, 7 } };
   cout << "Length of the longest path is "<< getLongestPathLength(mat);
}

输出

Length of the longest path is 4

更新于:2019-12-18

454 浏览量

开启您的 事业

通过完成课程获得认证

开始学习
广告
© . All rights reserved.