import os
import sys
# 请在此输入您的代码
'''
def dfs(grid, i, j, memo):
if memo[i][j] != -1:
return memo[i][j]
max_len = 1
directions = [(-1, 0), (1, 0), (0, -1), (0, 1)]
for dx, dy in directions:
ni, nj = i + dx, j + dy
if 1 <= ni <= n and 1 <= nj <= m and grid[i][j] > grid[ni][nj]:
current = dfs(grid, ni, nj, memo) + 1
if current > max_len:
max_len = current
memo[i][j] = max_len
return max_len
n, m = map(int, input().split())
grid = [[float('inf')] * (m + 2)]
for _ in range(n):
row = [float('inf')] + list(map(int, input().split())) + [float('inf')]
grid.append(row)
grid.append([float('inf')] * (m + 2))
memo = [[-1] * (m + 2) for _ in range(n + 2)]
max_length = 0
for i in range(1, n + 1):
for j in range(1, m + 1):
max_length = max(max_length, dfs(grid, i, j, memo))
print(max_length)
'''
def dfs(num,i,j,used):
if used[i][j] == True: # 当前位置已经遍历过,其最长深度也就是该位置的最长深度
return res[i][j]
if num[i][j] <= num[i+1][j] and num[i][j] <= num[i-1][j] and num[i][j] <= num[i][j+1] and num[i][j] <= num[i][j-1] :
used[i][j] = True
res[i][j] =1 # 当前位置不能往外移动
# 搜索上下左右四个位置,并且写入最大值
if 1<=i+1<=n and num[i][j] > num[i+1][j]:
if used[i+1][j]:
res[i][j] = max(res[i][j],res[i+1][j]+1)
else:
dfs(num,i+1,j,used)
used[i+1][j] = True
res[i][j] = max(res[i][j],res[i+1][j]+1)
if 1<=i-1<=n and num[i][j] > num[i-1][j]:
if used[i-1][j] :
res[i][j] = max(res[i][j],res[i-1][j]+1)
else:
dfs(num,i-1,j,used)
used[i-1][j] = True
res[i][j] = max(res[i][j],res[i-1][j]+1)
if 1<=j+1<=m and num[i][j] > num[i][j+1]:
if used[i][j+1]:
res[i][j] = max(res[i][j],res[i][j+1]+1)
else:
dfs(num,i,j+1,used)
used[i][j+1] = True
res[i][j] = max(res[i][j],res[i][j+1]+1)
if 1<=j-1<=m and num[i][j] > num[i][j-1]:
if used[i][j-1]:
res[i][j] = max(res[i][j],res[i][j-1]+1)
else:
dfs(num,i,j-1,used)
used[i][j-1] = True
res[i][j] = max(res[i][j],res[i][j-1]+1)
used[i][j] = True
n,m = map(int,input().split())
res = [[float('-inf')]*(m+2) for i in range(n+2)]
used = [[False]*(m+2) for i in range(n+2)]
num = []
num.append([float('inf')]*(m+2))
for i in range(n):
num.append([float('inf')] + list(map(int,input().split()))+[float('inf')])
num.append([float('inf')]*(m+2))
# print(num)
for i in range(1,1+n):
for j in range(1,1+m):
dfs(num,i,j,used)
maxlen = 0
for i in range(1,n+1):
for j in range(1,1+m):
maxlen = max(maxlen,res[i][j])
print(maxlen)
滑行问题dfs+记忆存储
最新推荐文章于 2025-06-14 09:35:25 发布