
- 本质就是利用递归,因为当前的i,j是基于上下左右的最大值,如果上下左右能走,代表值 + 1
#include <iostream>#include <algorithm>#include <cstring>using namespace std;const int N = 610;int n, m;int f[N][N], h[N][N];int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1}; // 表示上下左右四个点int dp(int x, int y){ int &v = f[x][y]; // 引用的v就是f[x][y],简化代码 if (v != -1) return v; // 只要算一遍就行,如果查的x,y不是-1直接返回对应的值就可以 v = 1; // 因为开始的点很有可能没有能走的点,但是初始值也得是1 for (int i = 0; i < 4; i++) { int a = dx[i] + x, b = dy[i] + y; if (a >= 1 && a <= n && b >= 1 && b <= m && h[a][b] < h[x][y]) v = max(v, dp(a, b) + 1); // 找出周围四个点最大的那个 } return v;}int main(){ ios::sync_with_stdio(false); cin >> n >> m; for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) cin >> h[i][j]; memset(f, -1, sizeof f); int res = 0; for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) res = max(res, dp(i, j)); cout << res << endl; return 0;}