小E的怪物挑战(javascript版)-豆包marscode算法刷题

105 阅读3分钟

问题描述

小E在一个游戏中遇到了n个按顺序出现的怪物。每个怪物都有其特定的血量h[i]和攻击力a[i]。小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:

输入:n = 3, H = 4, A = 5, h = [1, 2, 3], a = [3, 2, 1]
输出:1

样例2:

输入:n = 5, H = 10, A = 10, h = [6, 9, 12, 4, 7], a = [8, 9, 10, 2, 5]
输出:2

样例3:

输入:n = 4, H = 20, A = 25, h = [10, 15, 18, 22], a = [12, 18, 20, 26]
输出:3

样例4:

输入:n = 4, H = 20, A = 25, h = [22, 18, 15, 10], a = [26, 20, 18, 12]
输出: 1

题解

function solution(n, H, A, h, a) {
    // dp[i] 表示以第 i 个怪物为最后一个击败的怪物时,最多能击败的怪物数量
    const dp = new Array(n).fill(1);

    for (let i = 0; i < n; i++) {
        if (h[i] < H && a[i] < A) {
            for (let j = 0; j < i; j++) {
                if (h[j] < h[i] && a[j] < a[i]) {
                    dp[i] = Math.max(dp[i], dp[j] + 1);
                }
            }
        }
    }

    // 返回 dp 数组中的最大值
    return Math.max(...dp);
}

function main() {
    console.log(solution(3, 4, 5, [1, 2, 3], [3, 2, 1]) === 1);
    console.log(solution(5, 10, 10, [6, 9, 12, 4, 7], [8, 9, 10, 2, 5]) === 2);
    console.log(solution(4, 20, 25, [10, 15, 18, 22], [12, 18, 20, 26]) === 3);
    console.log(solution(4, 20, 25, [22, 18, 15, 10], [26, 20, 18, 12]) === 1);
}

main();

解题思路

为了实现这个算法,我们可以使用动态规划的方法。我们需要维护一个数组 dp,其中 dp[i] 表示以第 i 个怪物为最后一个击败的怪物时,最多能击败的怪物数量。

具体步骤如下:

  1. 初始化一个长度为 n 的 dp 数组,所有元素初始化为 1,因为至少可以击败自己。
  2. 遍历每个怪物 i,对于每个怪物 i,再遍历之前的所有怪物 j,检查是否可以击败怪物 i 并且 h[j] < h[i] 且 a[j] < a[i]
  3. 如果可以击败怪物 i 并且满足条件,则更新 dp[i] 为 dp[j] + 1 的最大值。
  4. 最后,dp 数组中的最大值即为小E最多能击败的怪物数量。

这个算法的时间复杂度为 O(n^2),适用于题目给定的约束条件(1 < n < 100)。