学习方法与心得

52 阅读3分钟

问题描述

image.png

测试样例

image.png

题目解析

动态规划是一类需要逻辑分析和递归思想的重要算法问题。我感觉动态规划的题最不好做,这道题是在marscode的帮助下完成的。AI真的很强大了。

题目要求:

  1. 怪物的血量和攻击力有一定的限制,小E只有在血量和攻击力分别高于怪物时才能击败它。
  2. 击败怪物后,小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

知识总结

  1. 动态规划的核心思想

    • 动态规划是一种通过记录中间状态减少重复计算的方法。在这道题中,dp[i] 记录了以怪物 i 为结尾时最多能击败的怪物数量,体现了“最优子结构”的特性。
  2. 状态转移方程的构建

    • 若击败第 i 个怪物,需要满足条件:其血量和攻击力比之前的某个怪物都高。状态转移公式为:dp[i]=max(dp[i],dp[j]+1)if h[j]<h[i] and a[j]<a[i]
  3. 全局最大值的维护

    • 在动态规划中,最终结果往往不是直接存储在最后一个状态中,因此我们需要在遍历过程中维护一个全局最大值。

学习计划

  1. 明确目标,逐步提升难度
    • 每周针对一种算法类型(如动态规划、贪心算法)选择5道题,从基础到进阶逐步解决。
    • 针对错题进行总结,将关键问题点和解决方法记录下来。
  2. 结合平台反馈优化代码
    • 使用MarsCode AI平台,针对每次提交的代码进行性能分析和错误检查,优化运行效率。
    • 学会通过平台提供的案例分析其他人的代码实现,发现更优解法。

最后,还是感觉marscode对效率的提升是巨大的,这题的动态规划公式是豆包帮我想的,想出动态规划的公式对动态规划的题目很重要,除此之外MarscodeAI平台会自动分析代码的时间复杂度和空间复杂度,并指出潜在的优化方向。例如本题的时间复杂度为n的平方,可以通过二分查找优化为 O(nlogn)。