题目来源:b站蓝桥杯Python省赛集训p3
题目:给一个矩阵
1,1,3
2,3,4
1,0,1
求矩阵最长递减路径
思路:
使用递归函数dfs(x,y,v),x是横坐标,y是纵坐标,v是上一个点的值。在函数中,先判断是否出界或值比上一个值小,若是,则直接返回0。然后比较每个点的上下左右四个点哪边的递减路径长,路径初始长度l=1,以向右为例:若之前已经比过别的方向,那么已有路径长度l,比较l和向右的路径长度1+dfs (x+1 , y , list[x][y]),将这个点的最大递减长度设置为两者最大值,即:
l=max(l,1+dfs (x+1 , y , list[x][y]))
最后返回X,y点的最大长度l
代码:
list=[[1,1,3],[2,3,4],[1,0,1]] n=3#hang m=3#lie def dfs(x,y,v): if x<0 or x==m or y<0 or y==n: #越界 return 0 if list[x][y]>=v: #增大返回0 return 0 l=1 l=max(1+dfs(x-1,y,list[x][y]),l) l =max(1+dfs(x+1,y,list[x][y]),l) l =max(1+dfs(x,y-1,list[x][y]),l) l =max(1+dfs(x,y+1,list[x][y]),l) return l ans=1 for i in range(n): for j in range(m): ans=max(ans,dfs(i,j,100)) print(ans)
优化:递归函数有很多重复计算,可使用记忆数组记录x,y点的最大递减长度,之后递归到x,y点即可直接调用