C++で指定された制約を持つマトリックス内の最長パスを検索します
次数nの正方行列が1つあるとします。それはすべて異なる要素を持っています。したがって、パスに沿ったすべてのセルが1の差で昇順になるように、最大長のパスを見つける必要があります。1つのセルから4つの方向に移動できます。左、右、上、下。したがって、行列が-
のような場合1 | 2 | 9 |
5 | 3 | 8 |
4 | 6 | 7 |
したがって、出力は4になります。最長パスは6→7→8→9
です。この問題を解決するために、私たちはこの考えに従います。すべてのセルから始まる最長パスを計算します。すべてのセルの最長パスを取得したら、すべての最長パスの最大値を返します。
このアプローチでの重要な観察の1つは、多くの重複するサブ問題です。したがって、この問題は動的計画法を使用して解決できます。ここでは、ルックアップテーブル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
-
C++で指定された開始文字からの最長の連続パスの長さを検索します
異なる文字のマトリックスが与えられます。 1つの文字から始めて、現在の文字よりも大きいすべての文字をトラバースすることにより、最長のパスを見つける必要があります。文字は互いに連続しています。 Eから始まります。 最長のパスを見つけるために、深さ優先探索アルゴリズムを使用します。 DFS中に、いくつかのサブ問題が複数回発生する場合があります。そのサブ問題の計算を何度も回避するために、動的計画法のアプローチを使用します。 例 #include<iostream> #define ROW 3 #define COL 3 using namespace std; // tool
-
与えられたシーケンスの最長増加部分列を見つけるためのC++プログラム
最長増加部分列は、1つの項目が前の項目よりも大きい部分列です。 ここでは、整数のセットから最長増加部分列の長さを見つけようとします。 Input: A set of integers. {0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15} Output: The length of longest increasing subsequence. Here it is 6. The subsequence is 0, 2, 6, 9, 13, 15. アルゴリズム longestSubSeq(subarray、n) 入力 :サブ配列と