解题思路:
注意事项:
参考代码:
n,m,k=map(int,input().split()) # 记录迷宫的宝贝价值 table=[] for _ in range(n): table.append(list(map(int,input().split()))) # 状态列表dp[1][2][3][4]=5 表示坐标(1,2)这个点物品数量为3最大价值为4的方案有5种 dp=[[[[-1]*15 for _ in range(15)] for _ in range(51)]for _ in range(51)] #深度遍历 def dfs(x,y,sum,max): #因为如果这个方案先前采用了,就会有一个值而不是初始值-1 if dp[x][y][sum][max+1]!=-1: #直接将记录过的状态返回 return dp[x][y][sum][max+1] #方案数 t=0 #到达终点 if x==n-1 and y==m-1: #最后一个格子能选 if table[x][y]>max: #可选可不选,若选那么只能再选最后一个(先前有k-1个) if sum==k or sum==k-1: t+=1 elif k==sum: #不能选也算一种方案 t+=1 dp[x][y][sum][max+1]=t #返回终点的方案数 return dp[x][y][sum][max+1] #向下走 if x+1<n: #可选 if table[x][y]>max: t+=dfs(x+1,y,sum+1,table[x][y]) t%=1000000007 #不选 t+=dfs(x+1,y,sum,max) t%=1000000007 #向右走 if y+1<m: #可选 if table[x][y]>max: t+=dfs(x,y+1,sum+1,table[x][y]) t%=1000000007 #不选 t+=dfs(x,y+1,sum,max) t%=1000000007 dp[x][y][sum][max+1]=t return dp[x][y][sum][max+1] dp[0][0][0][0]=dfs(0,0,0,-1) print(dp[0][0][0][0])
0.0分
6 人评分
Minesweeper (C语言代码)浏览:856 |
【出圈】 (C++代码)(典型的约瑟夫环——链表解决)浏览:1284 |
C二级辅导-计负均正 (C语言代码)浏览:652 |
汽水瓶 (C语言代码)浏览:764 |
Tom数 (C++代码)浏览:868 |
淘淘的名单 (C语言代码)浏览:1167 |
C语言程序设计教程(第三版)课后习题8.5 (C语言代码)浏览:956 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:701 |
1011题解浏览:819 |
1050题解(结构体数组与结构体指针的使用)浏览:1216 |