f[i][j] 所有从(i, j)开始滑的路径
属性:Max
状态计算:分情况讨论
f(i, j):向上、向下、向左、向右
先都把第一步f(i, j)去掉,f(i, j) += f(i, j + 1) + 1;
每一步存在的条件:右边的高度小于当前点的高度。
拓扑图:不能存在环,此题中不可能存在环
#include <cstring> #include <iostream> #include <algorithm> using namespace std; const int N = 310; int n, m, h[N][N], f[N][N]; int dx[4] = {-1,1,0,0}; int dy[4] = {0,0,1,-1}; int dp(int x, int y) { int &v = f[x][y]; if(v != -1) return v; v = 1; for(int i = 0; i < 4;i++) { int a = x + dx[i], b = y + dy[i]; 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() { 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; }