classSolution { public: int dx[4] = {0, 0, 1, -1}; int dy[4] = {1, -1, 0, 0};
intlongestIncreasingPath(vector<vector<int>>& matrix){ int n = matrix.size(); if (!n) return0; int m = matrix[0].size(); vector<vector<int> > dp(n, vector<int>(m, 0)); int res = 1; for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { dp[i][j] = dfs(matrix, i, j, dp); res = max(res, dp[i][j]); } } return res; }
intdfs(vector<vector<int>>& matrix, int x, int y, vector<vector<int>>& dp){ if (dp[x][y] > 0) return dp[x][y]; int n = matrix.size(), m = matrix[0].size(); dp[x][y] = 1; for (int i = 0; i < 4; ++i) { int nx = x + dx[i], ny = y + dy[i]; if (inside(nx, ny, n, m) && matrix[nx][ny] < matrix[x][y]) { dp[x][y] = max(dp[x][y], dfs(matrix, nx, ny, dp)+1); } } return dp[x][y]; }
boolinside(int x, int y, int n, int m){ return0 <= x && x < n && 0 <= y && y < m; } };
拓扑排序(c++)
classSolution { public: int dx[4] = {0, 0, 1, -1}; int dy[4] = {1, -1, 0, 0};
intlongestIncreasingPath(vector<vector<int>>& matrix){ int n = matrix.size(); if (!n) return0; int m = matrix[0].size(); vector<vector<int> > dp(n, vector<int>(m, 0)); vector<vector<int> > degree(n, vector<int>(m, 0)); queue<pair<int, int> > Q; for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { for (int k = 0; k < 4; ++k) { int nx = i + dx[k], ny = j + dy[k]; if (inside(nx, ny, n, m) && matrix[nx][ny] < matrix[i][j]) { degree[i][j]++; } } if (!degree[i][j]) { Q.push({i, j}); dp[i][j] = 1; } } } int res = 1; while (!Q.empty()) { int x = Q.front().first, y = Q.front().second; Q.pop(); res = max(res, dp[x][y]); for (int i = 0; i < 4; ++i) { int nx = x + dx[i], ny = y + dy[i]; if (inside(nx, ny, n, m) && matrix[nx][ny] > matrix[x][y]) { if (!(--degree[nx][ny])) { Q.push({nx, ny}); } dp[nx][ny] = max(dp[nx][ny], dp[x][y]+1); } } } return res; }
boolinside(int x, int y, int n, int m){ return0 <= x && x < n && 0 <= y && y < m; } };