问题描述 小E在一个游戏中遇到了 nn 个按顺序出现的怪物,每个怪物都有其特定的血量 hihi 和攻击力 aiai。小E的初始血量为 HH,攻击力为 AA。 游戏规则如下:
- 小E可以击败一个血量和攻击力都小于她当前属性的怪物。
- 对于第一个击败的怪物,需要满足其血量小于 HH 且攻击力小于 AA。
- 击败怪物后,小E会获得该怪物的属性值。
- 为了保持战斗节奏,要求击败的怪物序列中,后一个怪物的血量和攻击力都必须严格大于前一个怪物。
小E想知道,她最多能击败多少怪物。
测试样例 样例1:
输入:n = 3, H = 4, A = 5, h = [1, 2, 3], a = [3, 2, 1] 输出:1
样例2:
输入:n = 5, H = 10, A = 10, h = [6, 9, 12, 4, 7], a = [8, 9, 10, 2, 5] 输出:2
样例3:
输入:n = 4, H = 20, A = 25, h = [10, 15, 18, 22], a = [12, 18, 20, 26] 输出:3
动态规划实现
def solution(n: int, H: int, A: int, h: list, a: list) -> int:
# write code here
cnt=0
dp={}
for i in range(n):
if H>h[i] and A>a[i]:
dp[i]=1
for j in range(i):
if h[j]<h[i] and a[j]<a[i]:
dp[i]=max(dp[i],dp[j]+1)
cnt=max(dp[i],cnt)
return cnt
if __name__ == '__main__':
print(solution(3, 4, 5, [1, 2, 3], [3, 2, 1]) == 1)
print(solution(5, 10, 10, [6, 9, 12, 4, 7], [8, 9, 10, 2, 5]) == 2)
print(solution(4, 20, 25, [10, 15, 18, 22], [12, 18, 20, 26]) == 3)
代码说明 dp[i]:dp[i] 代表小E最多能击败怪物的数量,且最后一个被击败的怪物是怪物 i。 初始化: 首先,检查小E能否击败怪物 i,即 h[i] < H 和 a[i] < A,如果能击败,则至少能击败这个怪物(dp[i] = 1)。 接着,检查之前的每个怪物 j,如果怪物 i 的血量和攻击力都严格大于 j,且小E能够击败怪物 i,那么可以从 dp[j] 转移到 dp[i]。 max_monsters:最后,我们返回 dp[i] 数组中的最大值,这代表小E能够击败的最大怪物数量。 时间复杂度 时间复杂度:O(n^2),由于需要遍历每个怪物,并对每个怪物检查所有之前的怪物。 空间复杂度:O(n),用于存储动态规划的状态 dp。