题目要求某个点的滑坡距离最大,要想滑坡距离最大那么这个点的高度就要最高,因为高度最高,他就可以滑向任意一个它四周点,当然也要滑向在它的四周中高度最高的那个点。
我们可以定义dp[i][j]的状态为从i,j滑下去的最高长度,那么状态转移方程为dp[i][j]=max(dp[i][j],dp[i-1][j]+1)
dp[i][j]=max(dp[i][j],dp[i+1][j]+1),max(dp[i][j],dp[i][j-1]+1),max(dp[i][j],dp[i][j+1]+1),即dp[i][j]的最大值就是它滑向在它的四周中的最大值的那个点
#include <iostream> using namespace std; const int maxn = 105; int arr[maxn][maxn]; int dp[maxn][maxn]; int dir[4][2] = { {-1,0},{1,0},{0,-1},{0,1} }; int n, m; int res = 0; int calc(int x, int y) { if (dp[x][y] != 0)return dp[x][y]; dp[x][y]=1; for (int i = 0; i < 4; i++) { int newx = x + dir[i][0]; int newy = y + dir[i][1]; if (newx >= 1 && newx <= n && newy >= 1 && newy <= m&&arr[x][y]>arr[newx][newy]) { dp[x][y] = max(dp[x][y], calc(newx, newy) + 1); } } res = max(res, dp[x][y]); return dp[x][y]; } int main() { cin >> n >> m; for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { cin >> arr[i][j]; } } for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { calc(i, j); } } cout << res; }