从给定起始字符开始的最长连续路径
data structurealgorithmsdynamic programming
给定一个包含不同字符的矩阵。我们必须从一个字符开始,遍历所有大于当前字符的字符,从而找到最长路径。这些字符是连续的。
为了找到最长路径,我们将使用深度优先搜索算法。在深度优先搜索过程中,某些子问题可能会多次出现。为了避免反复计算,我们将使用动态规划方法。
输入和输出
输入: 如上所示的矩阵。以及起始点。此处的起始点为 e。 输出: 输入起始点 (a-i):e 最大连续路径:5
算法
findLongestLen(i, j, prev)
输入:位置 ij 和前一个字符。
输出: 最长长度。
Begin if (i, j) place is valid or prev and matrix[i,j] are adjacent, then return 0 if longestPath[i, j] is already filled, then return longestPath[i, j] len := 0 for all its nearest 8 rooms k, do len := maximum of len and (1 + findLongestLen(i, x[k], j +y[k], matrix[i, j])) done longestPath[i, j] := len return len End
getLen(start)
输入 − 起点。
输出 − 最大长度。
Begin for all row r of matrix, do for all column c, of matrix, do if matrix[i, j] = start, then for all adjacent room k, do len := maximum of len and (1 + findLongestLen(i, x[k], j +y[k], matrix[i, j]))) done done done return len End
示例
#include<iostream> #define ROW 3 #define COL 3 using namespace std; // 工具矩阵针对相邻单元格进行递归。 int x[] = {0, 1, 1, -1, 1, 0, -1, -1}; int y[] = {1, 0, 1, 1, -1, -1, 0, -1}; int longestPath[ROW][COL]; char mat[ROW][COL] = { {'a','c','d'}, {'h','b','a'}, {'i','g','f'} }; int max(int a, int b) { return (a>b)?a:b; } bool isvalid(int i, int j) { if (i < 0 || j < 0 || i >= ROW || j >= COL) //当 i 和 j 在范围内时 return false; return true; } bool isadjacent(char previous, char current) { return ((current - previous) == 1); //检查当前路径与上一个路径是否相邻 } int findLongestLen(int i, int j, char prev) { if (!isvalid(i, j) || !isadjacent(prev, mat[i][j])) //如果路径已经包含或不相邻 return 0; if (longestPath[i][j] != -1) return longestPath[i][j]; //子问题已解决 int len = 0; // Initialize result to 0 for (int k=0; k<8; k++) //递归查找最大路径的长度 len = max(len, 1 + findLongestLen(i + x[k], j + y[k], mat[i][j])); return longestPath[i][j] = len; // 保存长度并返回 } int getLen(char start) { for(int i = 0; i<ROW; i++) for(int j = 0; j<COL; j++) longestPath[i][j] = -1; //将所有元素设置为 -1 int len = 0; for (int i=0; i<ROW; i++) { for (int j=0; j<COL; j++) { // 检查所有可能的起点 if (mat[i][j] == start) { for (int k=0; k<8; k++) //for all eight adjacent cells len = max(len, 1 + findLongestLen(i + x[k], j + y[k], start)); } } } return len; } int main() { char start; cout << "Enter Starting Point (a-i): "; cin >> start; cout << "Maximum consecutive path: " << getLen(start); return 0; }
输出
Enter Starting Point (a-i): e Maximum consecutive path: 5