题目大意:中文题
解题思路:dp+dfs。dp保存步数以及标记是否走过。每个位置要去四周找一个比自身大的位置,如果有,位置移动继续判断,如果没有返回的步数为其四周最大的步数多1。
ac代码:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int map[105][105], dp[105][105], R, C, Max;
int dx[4]={
-1,1,0,0}, dy[4]={
0,0,-1,1};
int dfs(int x, int y)
{if (dp[x][y])return dp[x][y];for (int i=0; i<4; i++){if (x + dx[i] >= 0 && x + dx[i] < R && y + dy[i] >= 0 && y + dy[i] < C&& map[x][y] > map[x+dx[i]][y+dy[i]])dp[x][y] = max(dp[x][y], dfs(x+dx[i], y+dy[i])); }dp[x][y]++;
return dp[x][y];
}
int main()
{while (scanf("%d%d", &R, &C)!=EOF){memset(dp, 0, sizeof(dp));for (int i=0; i<R; i++)for (int j=0; j<C; j++)scanf("%d", &map[i][j]); Max = 1;for (int i=0; i<R; i++)for (int j=0; j<C; j++)Max = max(Max, dfs(i, j));printf("%d\n", Max);}
return 0;
}