问题描述
测试样例
题目解析
动态规划是一类需要逻辑分析和递归思想的重要算法问题。我感觉动态规划的题最不好做,这道题是在marscode的帮助下完成的。AI真的很强大了。
题目要求:
- 怪物的血量和攻击力有一定的限制,小E只有在血量和攻击力分别高于怪物时才能击败它。
- 击败怪物后,小E的属性会提升,并需要保证后续击败的怪物满足递增的条件。
以下是Python实现的完整代码:
def solution(n: int, H: int, A: int, h: list, a: list) -> int:
"""
计算最多能击败的怪物数量
参数:
n: int - 怪物数量
H: int - 小E初始血量
A: int - 小E初始攻击力
h: list - 怪物的血量列表
a: list - 怪物的攻击力列表
返回:
int - 小E最多可以击败的怪物数量
"""
# 初始化 dp 数组,dp[i] 表示以第 i 个怪物为结尾的最大击败怪物数量
dp = [0] * n
max_monsters = 0 # 记录全局最大击败数量
# 遍历每个怪物
for i in range(n):
# 检查当前怪物是否可以被击败(初始条件)
if h[i] < H and a[i] < A:
dp[i] = 1 # 如果符合条件,初始时可以击败怪物 i
# 遍历之前的怪物 j,判断是否可以作为子序列
for j in range(i):
# 判断递增条件:血量和攻击力都递增
if h[j] < h[i] and a[j] < a[i]:
dp[i] = max(dp[i], dp[j] + 1) # 更新 dp[i]
# 更新全局最大击败数量
max_monsters = max(max_monsters, dp[i])
return max_monsters
# 测试用例
if __name__ == '__main__':
print(solution(3, 4, 5, [1, 2, 3], [3, 2, 1]) == 1) # 测试样例 1
print(solution(5, 10, 10, [6, 9, 12, 4, 7], [8, 9, 10, 2, 5]) == 2) # 测试样例 2
print(solution(4, 20, 25, [10, 15, 18, 22], [12, 18, 20, 26]) == 3) # 测试样例 3
知识总结
-
动态规划的核心思想:
- 动态规划是一种通过记录中间状态减少重复计算的方法。在这道题中,
dp[i]记录了以怪物i为结尾时最多能击败的怪物数量,体现了“最优子结构”的特性。
- 动态规划是一种通过记录中间状态减少重复计算的方法。在这道题中,
-
状态转移方程的构建:
- 若击败第
i个怪物,需要满足条件:其血量和攻击力比之前的某个怪物都高。状态转移公式为:dp[i]=max(dp[i],dp[j]+1)if h[j]<h[i] and a[j]<a[i]
- 若击败第
-
全局最大值的维护:
- 在动态规划中,最终结果往往不是直接存储在最后一个状态中,因此我们需要在遍历过程中维护一个全局最大值。
学习计划
- 明确目标,逐步提升难度:
- 每周针对一种算法类型(如动态规划、贪心算法)选择5道题,从基础到进阶逐步解决。
- 针对错题进行总结,将关键问题点和解决方法记录下来。
- 结合平台反馈优化代码:
- 使用MarsCode AI平台,针对每次提交的代码进行性能分析和错误检查,优化运行效率。
- 学会通过平台提供的案例分析其他人的代码实现,发现更优解法。
最后,还是感觉marscode对效率的提升是巨大的,这题的动态规划公式是豆包帮我想的,想出动态规划的公式对动态规划的题目很重要,除此之外MarscodeAI平台会自动分析代码的时间复杂度和空间复杂度,并指出潜在的优化方向。例如本题的时间复杂度为n的平方,可以通过二分查找优化为 O(nlogn)。