算法题题解记录——6. 小E的怪物挑战

104 阅读1分钟

题目

www.marscode.cn/practice/r3…

image.png

关键词

动态规划

波折的解题过程

1. 审题不清,一脸懵逼

一开始整个理解错了,以为击败怪物的同时自己也会掉血(真是游戏打多了),同时以为怪物可以任意排序(纯眼瞎),附上错误答案,搞半天题目理解错了也是挺郁闷的。

image.png

2. 尝试贪心,一头雾水

因为是贪心类别的题目,直觉是类似于求最长递增子序列,用贪心可以拿当前的去找已经排序的数组中最后一个比自己小的生命值...? 但是搞半天没生成,附上错误答案:

image.png

3. 动态规划,一气呵成

动态规划的关键在于将大问题分解为不同状态的小问题,后一个状态和之前的状态无关(无后效性),以及后一个状态和前一个状态的关系(状态转移方程)

dp[i]表示前i个怪物中最大能够击败怪物的数量,则状态转移方程为:

dp[i]=max(dp[i],dp[j]+1)if 第j个怪物属性小于第i个怪物j[0,i1]dp[i]=max(dp[i],dp[j]+1),if 第j个怪物属性小于第i个怪物j∈[0,i−1]

代码

def solution(n: int, H: int, A: int, h: list, a: list) -> int:
    # write code here
    dp = [0] * n
    for i in range(n):
        if h[i] < H and a[i] < A:
            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)
    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)

复杂度

  • 时间复杂度 O(n²)

  • 空间复杂度 O(n)

问题

总觉得这题有贪心方案,有无大佬指点。