/**^**/一开始写的朴素递归。。把max引用传进函数去,最后只返回一个max,但时间超时,虽然逻辑没问题。。看了题解emmm,明白了是备忘录递归法,但基于我这种原始代码改的还麻烦,之前返回void,备忘录的话得返回每个节点得值,好吧,直接贴官方代码。总是一看就懂。。。气死

 

 

 1 class Solution {
 2 public:
 3     static constexpr int dirs[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
 4     int rows, columns;
 5 
 6     int longestIncreasingPath(vector< vector<int> > &matrix) {
 7         if (matrix.size() == 0 || matrix[0].size() == 0) {
 8             return 0;
 9         }
10         rows = matrix.size();
11         columns = matrix[0].size();
12         auto memo = vector< vector<int> > (rows, vector <int> (columns));
13         int ans = 0;
14         for (int i = 0; i < rows; ++i) {
15             for (int j = 0; j < columns; ++j) {
16                 ans = max(ans, dfs(matrix, i, j, memo));
17             }
18         }
19         return ans;
20     }
21 
22     int dfs(vector< vector<int> > &matrix, int row, int column, vector< vector<int> > &memo) {//返回以每个坐标点开始的最长路径
23         if (memo[row][column] != 0) {  //备忘录
24             return memo[row][column];
25         }
26         ++memo[row][column];
27         for (int i = 0; i < 4; ++i) {
28             int newRow = row + dirs[i][0], newColumn = column + dirs[i][1];
29             if (newRow >= 0 && newRow < rows && newColumn >= 0 && newColumn < columns && matrix[newRow][newColumn] > matrix[row][column]) {
30                 memo[row][column] = max(memo[row][column], dfs(matrix, newRow, newColumn, memo) + 1);  //四个方向的max
31             }
32         }
33         return memo[row][column];
34     }
35 };