"""
https://www.lanqiao.cn/problems/216/learning/?page=1&first_category_id=1&name=%E5%9C%B0%E5%AE%AB%E5%8F%96%E5%AE%9D
"""
import os
import sys
from functools import lru_cache
# @lru_cache(maxsize = None)的作用是保存每个dfs(x, y, z, w)的值,
# 对于已经保存的, 下次可以直接拿去用, 无需再次搜索。
@lru_cache(maxsize = None)
def dfs(x, y, z, w):
"""
:param x: 横坐标
:param y: 纵坐标
:param z: 手中的宝物的数量
:param w: 手中的宝物的最大价值
:return:
"""
# 走到终点
if x == n and y == m:
# 已经拿了k件宝物, 不拿当前位置的宝物
if z == k:
return 1
# 已经拿了k-1件宝物, 如果当前位置的宝物的价值大于于手中的任一个宝物就能拿第k件宝物
if z == k - 1 and w < Map[x][y]:
return 1
return 0
# 方案数 = 向右走的方案 + 向下走的方案
ans = 0
for delta_x, delta_y in [(1, 0), (0, 1)]:
xx, yy = x + delta_x, y + delta_y
if xx <= n and yy <= m:
# 走到(xx,yy)并且没有拿走宝物
ans += dfs(xx, yy, z, w)
# 走到(xx,yy), 如果当前位置的宝物的价值大于于手中的任一个宝物就能拿
if w < Map[x][y]:
ans += dfs(xx, yy, z + 1, Map[x][y])
return ans % 1000000007
n, m, k = map(int, input().split())
Map = [[0] * (m + 1)]
for i in range(n):
Map.append([0] + list(map(int, input().split())))
print(dfs(1, 1, 0, -1))
蓝桥杯-地宫取宝
最新推荐文章于 2024-08-15 11:54:48 发布