22636: 修仙之路
http://cs101.openjudge.cn/practice/22636/
修仙之路长漫漫,逆水行舟,不进则退!你过五关斩六将,终于来到了仙界。仙界是一个r行c列的二维格子空间,每个单元格是一个”境界“,每个境界都有等级。你需要任意选择其中一个境界作为起点,从一个境界可以前往上下左右相邻四个境界之一 ,当且仅当新到达的境界等级增加。你苦苦行走,直到所在的境界等级比相邻四个境界的等级都要高为止,一览众山小。请问包括起始境界在内最长修仙路径需要经过的境界数是多少?
输入
第一行为两个正整数,分别为r和c(1<=r,c<=100)。 接下来有r行,每行有c个0到100000000之间的整数,代表各境界的等级。
输出
输出一行,为最长修仙路径需要经过的境界数(包括起始境界)。
样例输入
5 5
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9样例输出
25python
# 23n2300011075(才疏学浅)
def dfs(i,j):
if dp[i][j]>0:
return dp[i][j]
else:
for k in range(4):
if 0<=i+d[k][0]<r and 0<=j+d[k][1]<c and maze[i][j]>maze[i+d[k][0]][j+d[k][1]]:
dp[i][j]=max(dp[i][j],dfs(i+d[k][0],j+d[k][1])+1)
return dp[i][j]
r,c=map(int,input().split())
maze=[]
for i in range(r):
l=list(map(int,input().split()))
maze.append(l)
dp=[[0]*c for _ in range(r)]
d=[[-1,0],[1,0],[0,1],[0,-1]]
ans=0
for i in range(r):
for j in range(c):
ans=max(ans,dfs(i,j))
print(ans+1)python
#23n2300011072(X)
from functools import lru_cache
@lru_cache(maxsize=None)
def dfs(x,y):
ans=0
for dx,dy in dir:
nx,ny=x+dx,y+dy
if 0<=nx<m and 0<=ny<n and h[nx][ny]<h[x][y]:
ans=max(ans,dfs(nx,ny)+1)
return ans
m,n=map(int,input().split())
h=[list(map(int,input().split())) for _ in range(m)]
dir=[(0,1),(1,0),(-1,0),(0,-1)]
res=0
for i in range(m):
for j in range(n):
res=max(res,dfs(i,j))
print(res+1)