搜索算法专题 [draft]
这里的搜索算法指的是 DFS、BFS等常见的基础算法。
TODO: leetcode 迷宫II 迷宫III
DFS&BFS
记忆化搜索
记忆化搜索不像深度优先搜索那样重复枚举所有情况,而是把已经计算的子问题保存下来,所以说:记忆化搜索 = 深度优先搜索的实现 + 动态规划的思想。
例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 25
class Solution { public: int n, m, path[202][202], res = 0; // path[i][j] 表示 matrix[i][j] 位置的最长递增路径 int d[5] = {-1, 0, 1, 0, -1}; int dfs(int x, int y, vector<vector<int>>& matrix) { if (path[x][y] != 0) return path[x][y]; // 使用已经存储的数据 path[x][y] = 1; // 初始化为1 for (int i = 0; i < 4; i++) { int nx = x + d[i], ny = y + d[i+1]; if (nx >= 0 && nx < n && ny >= 0 && ny < m && matrix[nx][ny] > matrix[x][y]) path[x][y] = max(path[x][y], dfs(nx, ny, matrix) + 1); } return path[x][y]; } int longestIncreasingPath(vector<vector<int>>& matrix) { n = matrix.size(), m = matrix[0].size(); for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { res = max(res, dfs(i, j, matrix)); } } return res; } };
此外这道题也可以用动态规划的方法解决,参考:动态规划
评论