单纯的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)