洛谷1434-滑雪-python-(记忆化搜索+dfs)

什么是记忆化搜索呢?搜索的低效在于没有能够很好地处理重叠子问题;动态规划虽然比较好地处理了重叠子问题,但是在有些拓扑关系比较复杂的题目面前,又显得无奈。记忆化搜索正是在这样的情况下产生的,它采用搜索的形式和动态规划中递推的思想将这两种方法有机地综合在一起,扬长避短,简单实用,在信息学中有着重要的作用。

记忆化搜索,我们在dfs过程中对于一已经搜索过的点,就不必再去搜索,直接返回,大大提高了搜索的效率
相比于常规的dfs算法,不用一条路搜到底,我们只需要在之前搜索过的点停止搜索即可。

python代码
我们在使用python的过程中,一定要注意对时间的把握,因为python代码慢
AC代码

global msg,f
global r,c
r,c=map(int,input().split())

xc=[0,-1,1,0]
yc=[-1,0,0,1]
def check(i,j):
    if 0<=i<r and 0<=j<c:
        return True
    return False

def dfs(x,y):
    ans=1
    for i in range(4):
        if check(x+xc[i],y+yc[i]) and msg[x+xc[i]][y+yc[i]]<msg[x][y]:
            if f[x+xc[i]][y+yc[i]]!=-1:
                ans=max(ans,f[x+xc[i]][y+yc[i]]+1)
            else:
                tmp=dfs(x+xc[i],y+yc[i])
                f[x+xc[i]][y+yc[i]]=tmp
                ans=max(ans,tmp+1)
    f[x][y]=ans
    return ans
f=[[-1 for i in range(c)] for j in range(r)]
msg=[0]*r
for i in range(r):
    msg[i]=list(map(int,input().split()))

ans=0
for i in range(r):
    for j in range(c):
        ans=max(ans,dfs(i,j))

print(ans)

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值