题目
关键词
动态规划
波折的解题过程
1. 审题不清,一脸懵逼
一开始整个理解错了,以为击败怪物的同时自己也会掉血(真是游戏打多了),同时以为怪物可以任意排序(纯眼瞎),附上错误答案,搞半天题目理解错了也是挺郁闷的。
2. 尝试贪心,一头雾水
因为是贪心类别的题目,直觉是类似于求最长递增子序列,用贪心可以拿当前的去找已经排序的数组中最后一个比自己小的生命值...? 但是搞半天没生成,附上错误答案:
3. 动态规划,一气呵成
动态规划的关键在于将大问题分解为不同状态的小问题,后一个状态和之前的状态无关(无后效性),以及后一个状态和前一个状态的关系(状态转移方程)
记dp[i]表示前i个怪物中最大能够击败怪物的数量,则状态转移方程为:
代码
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)
问题
总觉得这题有贪心方案,有无大佬指点。