1. 地宫取宝
题目描述
X 国王有一个地宫宝库。是 n x m 个格子的矩阵。每个格子放一件宝贝。每个宝贝贴着价值标签。
地宫的入口在左上角,出口在右下角。
小明被带到地宫的入口,国王要求他只能向右或向下行走。
走过某个格子时,如果那个格子中的宝贝价值比小明手中任意宝贝价值都大,小明就可以拿起它(当然,也可以不拿)。
当小明走到出口时,如果他手中的宝贝恰好是k件,则这些宝贝就可以送给小明。
请你帮小明算一算,在给定的局面下,他有多少种不同的行动方案能获得这k件宝贝。
输入
输入一行3个整数,用空格分开:n m k (1< =n,m< =50, 1< =k< =12)
接下来有 n 行数据,每行有 m 个整数 Ci (0< =Ci< =12)代表这个格子上的宝物的价值
输出
要求输出一个整数,表示正好取k个宝贝的行动方案数。该数字可能很大,输出它对 1000000007 取模的结果。
样例输入
2 3 2 1 2 3 2 1 5
样例输出
14
我看的一个链接:(153条消息) 每日一题 地宫取宝(第五届蓝桥杯省赛C++A/B/C组)_撒浪嘿呦x的博客-CSDN博客
这个博主写的特别清楚!!
我把它的代码改成了python:
代码:
n,m,k=map(int,input().split())
a=[]
mod=1000000007
for i in range(n):
l=list(map(int,input().split()))
for j in range(m):
l[j]=l[j]+1
a.append(l)
dp=[[[[0]*15 for i in range(15)] for j in range(51)] for kk in range(51)]
#边界条件赋值
for i in range(0,13):
dp[n][m][k][i]=1
if a[n-1][m-1]>i:
dp[n][m][k-1][i]=1
#####
for i in range(n,0,-1):
for j in range(m,0,-1):
for t in range(k,-1,-1):
for mx in range(13,-1,-1):
if i==n and j==m and (t==k or t==k-1):
continue
if a[i-1][j-1]>mx:
dp[i][j][t][mx]=(dp[i][j+1][t+1][a[i-1][j-1]]+dp[i+1][j][t+1][a[i-1][j-1]]+dp[i][j+1][t][mx]+dp[i+1][j][t][mx])%mod
else:
dp[i][j][t][mx]=(dp[i][j+1][t][mx]+dp[i+1][j][t][mx])%mod
print(dp[1][1][0][0])
1416

被折叠的 条评论
为什么被折叠?



