从任意一点可以往上下左右比它小的数那里走,问最远长度是多少
*解法:每一点dfs搜索一遍
递归:求解的方法都是相同的(距离是周围的点最大值加一),假设已知周围点的距离则dd[i] = dfs(xx, yy) + 1;
每一次递归将当前状态入栈,递归到头的时候返回时取出栈中状态
#include <iostream> #include <cstdio> using namespace std; int R, C; int a[105][105], ans[105][105]; int dx[] = {1, -1, 0, 0}; int dy[] = {0, 0, 1, -1}; int vis[105][105], dis[105][105]; int dfs(int x, int y) { int dd[] = {0, 0, 0, 0}; if(vis[x][y]) return dis[x][y];//没加这句T了 for(int i = 0; i < 4; i++) { int xx = x + dx[i], yy = y + dy[i]; if(xx >= 0 && xx < R && yy >= 0 && yy < C && a[xx][yy] < a[x][y]) { dd[i] = dfs(xx, yy) + 1; } } int res = 0; for(int i = 0; i < 4; i++) res = max(res, dd[i]); vis[x][y] = 1; dis[x][y] = res; return res; } int main() { int t = 0; scanf("%d %d", &R, &C); for(int i = 0; i < R; i++) for(int j = 0; j < C; j++) scanf("%d", &a[i][j]); for(int i = 0; i < R; i++) { for(int j = 0; j < C; j++) { ans[i][j] = dfs(i, j); t = max(t, ans[i][j]); } } printf("%d\n", t + 1); return 0; }