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

106 阅读2分钟

问题描述

小R正在研究一组观光景点,每个景点都有一个评分,保存在数组 values 中,其中 values[i] 表示第 i 个观光景点的评分。同时,景点之间的距离由它们的下标差 j - i 表示。

一对景点 (i < j) 的观光组合得分为 values[i] + values[j] + i - j,也就是两者评分之和减去它们之间的距离。

小R想知道,在哪种情况下能够获得观光景点组合的最高得分。


测试样例

样例1:

输入:values = [8, 3, 5, 5, 6]
输出:11

样例2:

输入:values = [10, 4, 8, 7]
输出:16

样例3:

输入:values = [1, 2, 3, 4, 5]
输出:8

解题思路

  1. 分解公式:我们可以将公式 values[i] + values[j] + i - j 分解为 (values[i] + i) + (values[j] - j)。这样,我们可以分别处理 values[i] + i 和 values[j] - j

  2. 动态规划思想:我们可以遍历数组,同时维护一个变量来记录当前最大的 values[i] + i。对于每个 j,我们只需要计算 values[j] - j 并与当前最大的 values[i] + i 相加,然后更新最大得分。

  3. 初始化max_score 用于记录最大得分,max_i_plus_value 用于记录当前最大的 values[i] + i

  4. 遍历数组:对于每个 j,计算 values[j] - j 并与 max_i_plus_value 相加,更新 max_score

  5. 更新 max_i_plus_value:在每次遍历中,更新 max_i_plus_value 以确保它始终是当前最大的 values[i] + i

个人思考

问题理解

首先,我需要理解题目要求:找到一对景点 (i, j) 使得 values[i] + values[j] + i - j 最大,其中 i < j。这个公式看起来有点复杂,但我们可以尝试分解它来简化问题。

公式分解

我注意到公式 values[i] + values[j] + i - j 可以分解为 (values[i] + i) + (values[j] - j)。这样,我们可以分别处理 values[i] + i 和 values[j] - j

动态规划思想

接下来,我想到可以使用动态规划的思想来解决这个问题。我们可以遍历数组,同时维护一个变量来记录当前最大的 values[i] + i。对于每个 j,我们只需要计算 values[j] - j 并与当前最大的 values[i] + i 相加,然后更新最大得分。

总结

通过分解公式和使用动态规划的思想,我成功地将问题简化并高效地解决了。这个过程让我意识到,有时候将复杂的问题分解成更小的部分,并使用适当的算法思想,可以大大简化问题的解决过程。