AI 刷题 109. 小M的光明之魂速通挑战 题解 | 豆包MarsCode AI 刷题

66 阅读2分钟

109. 小M的光明之魂速通挑战

问题描述

小M在速通比赛中需要击败一系列Boss,并且他只能使用有限数量的武器。每把武器仅能使用一次,但可以击败两种类型的Boss。更具挑战性的是,小M必须按照Boss的出现顺序逐个击败,而不能跳过或更改顺序。问题的核心是:在这些限制下,小M最多能击败多少个Boss?

这一问题的解决不仅仅依赖于简单的穷举,而需要通过搜索算法找到满足条件的最优解。

问题分析

这个问题本质上是一个搜索问题,需要我们通过一定的策略,找到最多能够击败Boss的方案。我们需要特别注意以下约束条件:

  1. 武器限制:每把武器只能使用一次,且只能击败两种类型的Boss。
  2. 顺序限制:必须按照给定顺序逐个击败Boss。
  3. 问题目标:在满足上述约束的前提下,尽可能多击败Boss。

结合这些条件,我们可以将问题建模为一种深度优先搜索(DFS)的求解问题。通过DFS,我们可以遍历所有可能的武器组合,并在遍历过程中记录击败的Boss数量。

思路解析

  1. 状态定义
  • 当前Boss的索引 index:表示小M当前需要击败的Boss。
  • 武器使用情况 used:一个布尔数组,记录每把武器是否已经被使用。
  1. 状态转移
  • 如果当前Boss能被某把未使用的武器击败,则尝试使用该武器,并进入下一Boss的击败尝试。
  • 每次状态转移后,恢复武器状态(回溯)。
  1. 递归终止条件
  • 如果当前Boss的索引超出范围(即index == len(boss)),说明所有Boss都尝试过击败,返回已击败的数量。
  1. 结果记录
  • 在递归过程中,更新击败的最大Boss数量。

代码详解

以下是代码实现,包含详细注释:

def solution(n, m, boss, array):
    used = [False] * n # 使用状态数组记录每把武器是否已使用
    return dfs(boss, array, used, 0)
    
def dfs(boss, array, used, index):
    # 递归终止条件:所有Boss尝试完
    if index == len(boss):
        return 0
    
    max_kill = 0 # 记录当前路径下最多击败的Boss数量
    for i in range(len(array)):
        # 检查武器是否可用,且能击败当前Boss
        if not used[i] and (array[i][0] == boss[index] or array[i][1] == boss[index]):
            used[i] = True # 标记武器为已使用
            # 尝试击败当前Boss并递归处理下一个
            kills = 1 + dfs(boss, array, used, index + 1)
            used[i] = False # 回溯时恢复状态
            # 更新最大击败数量
            max_kill = max(max_kill, kills)
    # 当前Boss无法击败,直接尝试跳过
    return max(max_kill, dfs(boss, array, used, index + 1))