题目:
小E在一个游戏中遇到了n个按顺序出现的怪物。每个怪物都有其特定的血量hi和攻击力ai。小E的初始血量为H,攻击力为A。游戏规则如下:
1.小E可以击败血量和攻击力都小于她当前属性的怪物
2.对于每只怪物,小E可以选择与它战斗或者跳过这只怪物
3.为了保持战斗节奏,要求击败的怪物序列中,后一个怪物的血量和攻击力都必须严格大于前一个怪物
小E想知道,她最多能击败多少怪物。
输入
n:怪物的数量H:小E的血量A:小E的攻击力h[i]:第i个怪物的血量a[i]:第i个怪物的攻击力
输出
- 返回小E最多能击败的怪物数量
约束条件
1<n<1001<H,A,h[i],a[i]<1000
×错误做法:
- 题目要求保证小E可以击败怪物,也就是说一击必杀,不用回合制地计算怪物的剩余血量
- 小E的血量随着怪物数增加会越来越少,但是攻击力不会受到影响,写多余一条
- 保证每回合怪物的攻击力要大于前一个,没有写这个条件的判断
√正确做法:
public static int solution(int n, int H, int A, int[] h, int[] a) {
int maxKilled = 0;
int[] dp = new int[n]; // dp[i] 表示以第i个怪物结束时能击败的最大怪物数
for (int i = 0; i < n; i++) {
if (h[i] < H && a[i] < A) { // 可以击败这个怪物
int max = 0; // 以第i个怪物结束的最大击败数
for (int j = 0; j < i; j++) {
if (h[j] < h[i] && a[j] < a[i] && dp[j] > max) {
max = dp[j]; // 找到以血量和攻击力小于当前怪物的怪物结束的最大击败数
}
}
dp[i] = max + 1; // 当前怪物可以击败,加上当前这个怪物
maxKilled = Math.max(maxKilled, dp[i]); // 更新最大击败数
}
}
return maxKilled;
}