题意
题解
d p [ x ] [ y ] dp[x][y] dp[x][y] 代表以点 ( x , y ) (x,y) (x,y) 为起点的最长递增路径, ( n x , n y ) (nx,ny) (nx,ny) 为从 ( x , y ) (x,y) (x,y) 出发的下一个位置,则有递推式
d p [ x ] [ y ] = m a x { d p [ n x ] [ n y ] + 1 } dp[x][y]=max\{dp[nx][ny]+1\} dp[x][y]=max{dp[nx][ny]+1}
记忆化搜索即可。
class Solution
{
#define maxn 205
public:
int dx[4] = {1, -1, 0, 0}, dy[4] = {0, 0, 1, -1};
int n, m, dp[maxn][maxn];
int rec(int x, int y, vector<vector<int>> &mat)
{
if (dp[x][y] != -1)
return dp[x][y];
int res = 1;
for (int i = 0; i < 4; i++)
{
int nx = x + dx[i], ny = y + dy[i];
if (nx >= 0 && nx < n && ny >= 0 && ny < m && mat[x][y] < mat[nx][ny])
{
res = max(res, rec(nx, ny, mat) + 1);
}
}
return dp[x][y] = res;
}
int longestIncreasingPath(vector<vector<int>> &matrix)
{
if (matrix.size() == 0)
return 0;
int res = 0;
n = matrix.size(), m = matrix[0].size();
memset(dp, -1, sizeof(dp));
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
res = max(rec(i, j, matrix), res);
}
}
return res;
}
};