观光景点组合得分问题 | 豆包MarsCode AI刷题

5 阅读4分钟

解题思路

  1. 分解公式:我们可以将公式 values[i] + values[j] + i - j 分解为 (values[i] + i) + (values[j] - j)。这样,我们可以分别处理 values[i] + i 和 values[j] - j
  2. 遍历数组:我们可以遍历数组 values,对于每个 j,我们只需要找到在 j 之前的 i 使得 values[i] + i 最大。
  3. 动态更新最大值:在遍历过程中,我们可以动态更新 values[i] + i 的最大值,并用它来计算当前 j 的得分。

代码实现


def solution(values: list) -> int:
    # write code here
    n = len(values)
    max_score = 0
    maxA = values[0] + 0  # A[0] = values[0] + 0

    for j in range(1, n):
        # 计算 B[j] = values[j] - j
        currentB = values[j] - j
        # 计算得分
        max_score = max(max_score, maxA + currentB)
        # 更新 maxA
        maxA = max(maxA, values[j] + j)

    return max_score
    
    
    

关键步骤解释

  1. 初始化max_score 用于存储最大得分,max_i_plus_value 用于存储当前最大的 values[i] + i
  2. 遍历:对于每个 j,计算当前得分 current_score,并更新 max_score
  3. 更新 max_i_plus_value:在每次遍历中,更新 max_i_plus_value 以确保它始终是当前最大的 values[i] + i

代码详解

1. 函数定义

def solution(values: list) -> int:
    # write code here

这里定义了一个名为 solution 的函数,它接受一个列表 values 作为参数,并且函数的返回值类型被指定为整数 int。这个函数的目的是根据给定的 values 列表中的元素进行一系列计算,并最终返回一个整数值作为结果。

2. 初始化变量

n = len(values)
max_score = 0
maxA = values[0] + 0  # A[0] = values[0] + 0
  • n = len(values):首先获取输入列表 values 的长度,并将其存储在变量 n 中。这个长度值将用于后续的循环操作,以遍历整个列表。
  • max_score = 0:初始化一个变量 max_score 为 0,这个变量将用于记录在整个计算过程中得到的最大得分。
  • maxA = values[0] + 0:这里初始化变量 maxA,它的初始值被设置为列表 values 中的第一个元素加上 0。从注释可以看出,这里似乎是在模拟某种与 A 相关的计算起始情况,其中 A[0] 被定义为 values[0] + 0

3. 循环计算

for j in range(1, n):
    # 计算 B[j] = values[j] - j
    currentB = values[j] - j
    # 计算得分
    max_score = max(max_score, maxA + currentB)
    # 更新 maxA
    maxA = max(maxA, values[j] + j)
  • 循环范围:通过 for j in range(1, n),从索引为 1 开始(因为前面已经单独处理了索引为 0 的情况),一直到列表的长度 n(不包括 n),对列表中的每个元素进行循环处理。
  • 计算 B[j]:在每次循环中,首先计算 currentB,它的值被定义为当前列表元素 values[j] 减去当前的索引 j,这里可以看作是在模拟计算一个与列表元素和索引相关的 B 序列的值(从代码逻辑推测,可能是某种特定问题场景下的定义)。
  • 计算得分:然后,通过 max_score = max(max_score, maxA + currentB),计算当前的得分情况。它会比较当前的 max_score 值和 maxA + currentB 的值,取两者中的较大值更新 max_score。这里的逻辑是在不断寻找整个计算过程中的最大得分组合,其中 maxA 代表之前计算得到的某个与 A 相关的最大值,currentB 是当前循环计算出的与 B 相关的值。
  • 更新 maxA:最后,通过 maxA = max(maxA, values[j] + j) 更新 maxA 的值。它会比较当前的 maxA 值和 values[j] + j 的值,取两者中的较大值更新 maxA。这样做的目的是在每次循环中,保持 maxA 始终是到当前元素为止,按照 values[j] + j 这种计算方式得到的最大值,以便在下一次循环中用于计算得分。

4. 返回结果

return max_score

在完成整个列表的遍历和计算后,函数最终返回 max_score,这个值就是在整个计算过程中,根据给定的 values 列表元素按照特定的计算规则(涉及到 A 和 B 的模拟计算方式)得到的最大得分。

`