Skip to content

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

样例输出

25
python
# 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)