### 问题描述一位年轻的勇士来到了魔堡魔堡的地形可以看成是一个 $n times m$ 的二维平面每个平面点上都有一只怪物。这位勇士最开始在魔堡顶端他可以进入第一行的任意一个点作为起点他要寻找到一条路径杀到最后一行从而穿越魔堡。这位勇者对魔堡中出现的所有怪物都计算了它们对应的生命值。勇者每次进入一个点会率先发起攻击只要攻击力大于等于该怪物的生命值就可以将其击杀如果无法一击必杀怪物就会反攻勇者。勇
思路解析
这是一道典型的动态规划问题。我们可以使用动态规划的方法来解决。
首先,我们定义一个二维数组 dp,其中 dp[i][j] 表示勇者从第一行的第 j 列开始,到达第 i 行时的最小攻击力。
接下来,我们可以根据题目要求,来确定 dp[i][j] 的计算方法。
首先,如果 i 为第一行,那么 dp[i][j] 就是 a[i][j],即第一行的怪物的生命值。
然后,对于其他行的怪物,我们可以根据题目要求来确定 dp[i][j] 的计算方法。
我们可以选择从上一行的相邻三个位置中选择一个最小的 dp 值,然后加上当前行的怪物的生命值 a[i][j],得到 dp[i][j] 的值。
最后,我们只需要在最后一行中选择一个最小的 dp 值,即为所求的最小攻击力。
具体的算法如下:
- 读入输入,构建二维数组
a和dp。 - 初始化第一行的
dp值为a的值。 - 从第二行开始,对于每一行的每一个位置,计算
dp[i][j]的值。 - 在最后一行中选择一个最小的
dp值,即为所求的最小攻击力。 - 输出结果。
代码实现
n, m = map(int, input().split())
a = []
dp = []
for _ in range(n):
row = list(map(int, input().split()))
a.append(row)
dp.append([0] * m)
# 初始化第一行的dp值为a的值
dp[0] = a[0]
# 从第二行开始,计算dp[i][j]的值
for i in range(1, n):
for j in range(m):
dp[i][j] = min(dp[i-1][(j-1)%m], dp[i-1][j], dp[i-1][(j+1)%m]) + a[i][j]
# 在最后一行中选择一个最小的dp值,即为所求的最小攻击力
min_attack = min(dp[n-1])
# 输出结果
print(min_attack)
复杂度分析
该算法使用了两层循环来计算 dp 值,因此时间复杂度为 $O(n \cdot m)$。
同时,使用了两个二维数组 a 和 dp 来存储输入和中间结果,因此空间复杂度为 $O(n \cdot m)$
原文地址: https://www.cveoy.top/t/topic/iF89 著作权归作者所有。请勿转载和采集!