问题描述
小E在一个游戏中遇到了 个按顺序出现的怪物,每个怪物都有其特定的血量 和攻击力 。小E的初始血量为 ,攻击力为 。 游戏规则如下:
- 击败条件:小E可以击败一个血量和攻击力都小于她当前属性的怪物。
- 初始条件:对于第一个击败的怪物,需要满足其血量小于 且攻击力小于 。
- 属性继承:击败怪物后,小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
解题思路
- 理解问题:我们需要找到一个最长的怪物序列,使得小E可以依次击败这些怪物,并且每个怪物的血量和攻击力都严格大于前一个怪物。
- 初始条件:第一个击败的怪物需要满足其血量小于 且攻击力小于 。
- 动态规划:可以使用动态规划来解决这个问题。定义一个数组
dp
,其中dp[i]
表示以第i
个怪物结尾的最长序列长度。 - 状态转移:对于每个怪物
i
,检查所有之前的怪物j
,如果h[i] > h[j]
且a[i] > a[j]
,则可以更新dp[i]
。 - 最终结果:遍历
dp
数组,找到最大值即为所求。
通过以上步骤,我们可以逐步构建出解决这个问题的算法。
def solution(n: int, H: int, A: int, h: list, a: list) -> int:
# 初始化dp数组,dp[i]表示以第i个怪物结尾的最长序列长度
dp = [0] * n
# 遍历每个怪物
for i in range(n):
# 检查是否满足初始条件
if h[i] < H and a[i] < A:
dp[i] = 1
else:
continue
# 检查之前的怪物,更新dp[i]
for j in range(i):
if h[i] > h[j] and a[i] > a[j]:
dp[i] = max(dp[i], dp[j] + 1)
# 返回dp数组中的最大值
return max(dp)
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)