地宫寻宝

题目

单纯的dfs搜索,100分只得了42分。超时了。
写代码的时候有个坑,就是在走到最后一步的时候,不要急着判断numk,因为在该位置还存在其他情况。1.numk 2.num=k-1 3.num<k-1,三种情况,所以判断出来的情况比较少,经过改正正确了。

def dfs(row,col,num):
    global ans
    if row>n-1 or col>m-1 or num>k:
        return
    if row==n-1 and col==m-1:#注意这里的判断条件不要加上num==k,
        #因为在最后一格,也需要判断需不需要加上最后一个礼物
        #如果加上num==k,那么就默认不需要最后一个礼物了
        if num==k:#不需要最后一个礼物,因为以及数量达到了k
            ans=(ans+1)%1000000007
            return
        elif num+1==k and (len(temp)==0 or arr[row][col]>max(temp)):
            #需要加上最后一个礼物,才达到k个礼物
            ans=(ans+1)%1000000007
            return
        else:#加上最后一个礼物也达不到k个礼物
            return
    if len(temp)==0 or arr[row][col]>max(temp):#加上该位置礼物,然后继续走
        temp.append(arr[row][col])
        dfs(row,col+1,num+1)
        dfs(row+1,col,num+1)
        temp.pop(len(temp)-1)
    #不加上该位置礼物,然后继续走
    dfs(row,col+1,num)
    dfs(row+1,col,num)

n,m,k=map(int,input().strip().split())
arr=[]
for i in range(n):
    arr.append(list(map(int,input().strip().split())))
temp=[]
ans=0
if k>m+n-1:
    print(0)
else:
    dfs(0,0,0)
    print(ans)

这里使用了记忆搜索和DFS,有一点自底向上的感觉。而单纯的DFS是自顶向下。这里还用了4维数组。注意题目里面的价值最低为0,所以初始化最大价值为-1
解题思路:
1.明显看出是一个dfs的题,暴力搜索各种路径
2.注意如果只用dfs会超时
3.所以要记忆走过的路径,二者集合起来即为 记忆化搜索!
注意事项:1.这题不仅要搜索,搜索中还得判断是否要拿走宝物,所以是个带参判断的搜索,宝物的价值即为需要考虑的参数。
2.记得用初始化数组为-1 。
3.由于宝物可能为0,max初始为-1,dp中要max+1

def dfs(row,col,num,value):#目前的数量和全部宝贝中的最大价值
    if row>n-1 or col>m-1 or num>k:
        return 0
    if dp[row][col][num][value+1]!=-1:
        return dp[row][col][num][value+1]
    if row==n-1 and col==m-1:#注意这里的判断条件不要加上num==k,
        #因为在最后一格,也需要判断需不需要加上最后一个礼物
        #如果加上num==k,那么就默认不需要最后一个礼物了
        if num==k:#不需要最后一个礼物,因为以及数量达到了k
            return 1
        elif num+1==k and arr[row][col]>value:
            #需要加上最后一个礼物,才达到k个礼物
            return 1
        else:#加上最后一个礼物也达不到k个礼物
            return 0
    a=0
    if arr[row][col]>value:#加上该位置礼物,然后继续走
        a+=dfs(row,col+1,num+1,arr[row][col])
        a+=dfs(row+1,col,num+1,arr[row][col])
    #不加上该位置礼物,然后继续走
    a+=dfs(row,col+1,num,value)
    a+=dfs(row+1,col,num,value)
    dp[row][col][num][value+1]=a
    return a%MOD


n,m,k=map(int,input().strip().split())
arr=[]
MOD = 1000000007
for i in range(n):
    arr.append(list(map(int,input().strip().split())))
dp=[[[[-1 for _ in range(15)] for _ in range(15)] for _ in range(m)] for _ in range(n)]
if k>m+n-1:
    print(0)
else:
    ans=dfs(0,0,0,-1)
    print(ans)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值