赞
踩
n, m, k = map(int, input().split()) s=[] for i in range(n): s.append(list(map(int, input().split()))) dp = [[[[-1]*15 for _ in range(15)]for _ in range(51)]for _ in range(51)] #创建一个四维列表,每个值都为-1 def dfs(x, y, sum, max): #如果其中一个方案使用过了,不是-1了,就返回它的值(结合下面,即每个值都会返回一个t) if dp[x][y][sum][max+1] != -1: return dp[x][y][sum][max+1] #因为题目中宝物价值包含0,所以max要从-1开始,从0开始的话,0处的宝物就不能被拾起了 t = 0 #一开始的方案数 #到达终点,也就是dfs的底 if x==n-1 and y==m-1: #到达终点 if s[x][y] > max: #比最大价值大 if sum==k or sum==k-1: #手里的数量刚好为k或者差一个为k t+=1 elif k==sum: #比最大价值小,但手里的数量刚好为k t+=1 dp[x][y][sum][max+1]=t return dp[x][y][sum][max+1] #返回某起点到了终点一趟的方案数 #为什么不直接return t是因为每次dfs完t变成0(看dfs前部分代码)只有return dp[x][y][sum][max+1]才能保留每次t的值并给到t if x+1 < n: #可以向下走 #可选 if s[x][y] > max: #比最大的大 t += dfs(x+1, y, sum+1, s[x][y]) #这里的t就是,之前得到的t + 从这里开始走到底(有可能有多种路径)得到的t, 下面类似的式子都同理 t%=1000000007 #输出t对1000000007的取模结果 #不选 t += dfs(x+1, y, sum, max) t%=1000000007 if y+1<m: #可选 if s[x][y]>max: t += dfs(x, y+1,sum+1,s[x][y]) t%=1000000007 #不选 t += dfs(x, y+1, sum, max) t%=1000000007 dp[x][y][sum][max+1] = t #返回某起点到达终点所有路径得到的t return dp[x][y][sum][max+1] print(dfs(0, 0, 0, -1)) #为了max能遍历到0,故要从-1开始
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。