小E的怪物挑战 - 字节训练营笔记

117 阅读2分钟

题目:

小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 < 100
  • 1 < H,A,h[i],a[i] < 1000
×错误做法:
  1. 题目要求保证小E可以击败怪物,也就是说一击必杀,不用回合制地计算怪物的剩余血量
  2. 小E的血量随着怪物数增加会越来越少,但是攻击力不会受到影响,写多余一条
  3. 保证每回合怪物的攻击力要大于前一个,没有写这个条件的判断
√正确做法:
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;
    }