Description
Submission
class Solution { typedef pair<int, int> PII; vector<PII> dirs; int m, n; vector<vector<int>> matrix; int maxVal[201][201]; vector<PII> Next(int i, int j) { vector<PII> rets; for(auto [dm, dn]: dirs) { int x = i + dm, y = j + dn; if(x >= 0 && x < m && y >= 0 && y < n && matrix[x][y] > matrix[i][j]) { rets.push_back({x, y}); } } return rets; } int dfs(int x, int y, int cur) { if(cur <= maxVal[x][y]) return 0; maxVal[x][y] = cur; auto pairs = Next(x, y); if(pairs.empty()) return 1; int ret = 0; for(auto [a, b]: pairs) { ret = max(dfs(a, b, cur + 1), ret); } return ret + 1; } public: int longestIncreasingPath(vector<vector<int>>& matrix) { m = matrix.size(); n = matrix[0].size(); this->matrix = matrix; dirs = {{-1, 0}, {0, -1}, {1, 0}, {0, 1}}; vector<vector<int>> haveIn(m, vector<int>(n, 0)); for(int i = 0; i < m; ++i) { for(int j = 0; j < n; ++j) { for(auto [x, y]: Next(i, j)) { haveIn[x][y] = 1; } } } queue<PII> q; // {pair, maxVal} int ret = 0; for(int i = 0; i < m; ++i) { for(int j = 0; j < n; ++j) { if(!haveIn[i][j]) { ret = max(dfs(i, j, 1), ret); } } } return ret; } };