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

77 阅读3分钟

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

在编程的世界里,处理数组和组合问题是非常常见的任务。今天,我们来探讨一个具体的题目:小R正在研究一组观光景点,每个景点都有一个评分,保存在数组 values 中,其中 values[i] 表示第 i 个观光景点的评分。同时,景点之间的距离由它们的下标差 j - i 表示。一对景点 (i < j) 的观光组合得分为 values[i] + values[j] + i - j,也就是两者评分之和减去它们之间的距离。小R想知道,在哪种情况下能够获得观光景点组合的最高得分。

问题描述

小R正在研究一组观光景点,每个景点都有一个评分,保存在数组 values 中,其中 values[i] 表示第 i 个观光景点的评分。同时,景点之间的距离由它们的下标差 j - i 表示。一对景点 (i < j) 的观光组合得分为 values[i] + values[j] + i - j,也就是两者评分之和减去它们之间的距离。小R想知道,在哪种情况下能够获得观光景点组合的最高得分。

测试样例

  • 样例1

    • 输入:values = [8, 3, 5, 5, 6]
    • 输出:11
    • 解释:最高得分的组合是 (0, 4),得分为 8 + 6 + 0 - 4 = 11。
  • 样例2

    • 输入:values = [10, 4, 8, 7]
    • 输出:16
    • 解释:最高得分的组合是 (0, 2),得分为 10 + 8 + 0 - 2 = 16。
  • 样例3

    • 输入:values = [1, 2, 3, 4, 5]
    • 输出:8
    • 解释:最高得分的组合是 (0, 3),得分为 1 + 4 + 0 - 3 = 8。

解题思路

动态规划与贪心算法的结合

在这个问题中,我们需要计算一对景点 (i < j) 的最高得分。具体思路如下:

  1. 初始化:定义两个变量 max_i_plus_values 和 max_score,分别表示当前最大 values[i] + i 和当前最高得分。初始时,max_i_plus_values 为 values[0] + 0max_score 为 values[0] + values[1] + 0 - 1
  2. 遍历每个景点:从第 1 个景点开始,遍历每个景点 j
  3. 计算当前得分:对于每个景点 j,计算 values[j] - j,并更新 max_score
  4. 更新最大值:更新 max_i_plus_values,确保它始终为当前最大 values[i] + i
  5. 返回结果:最终返回 max_score,即为最高得分。

代码实现

python

复制代码

def solution(values: list) -> int:
    n = len(values)
    if n < 2:
        return 0
    
    max_i_plus_values = values[0] + 0
    max_score = values[0] + values[1] + 0 - 1
    
    for j in range(1, n):
        current = values[j] - j
        max_score = max(max_score, max_i_plus_values + current)
        max_i_plus_values = max(max_i_plus_values, values[j] + j)
    
    return max_score

if __name__ == '__main__':
    print(solution(values=[8, 3, 5, 5, 6]) == 11)  # 输出: True
    print(solution(values=[10, 4, 8, 7]) == 16)  # 输出: True
    print(solution(values=[1, 2, 3, 4, 5]) == 8)  # 输出: True

代码解析

  • solution 方法

    • 初始化:定义 max_i_plus_values 和 max_score,初始值分别为 values[0] + 0 和 values[0] + values[1] + 0 - 1
    • 遍历每个景点:从第 1 个景点开始,遍历每个景点 j
    • 计算当前得分:对于每个景点 j,计算 values[j] - j,并更新 max_score
    • 更新最大值:更新 max_i_plus_values,确保它始终为当前最大 values[i] + i
    • 返回结果:最终返回 max_score,即为最高得分。
  • main 方法

    • 测试了三个样例,验证了 solution 方法的正确性。

时间和空间复杂度分析

  • 时间复杂度:O(n),其中 n 是景点的数量。我们只需要遍历数组一次。
  • 空间复杂度:O(1),我们只使用了常数级的额外空间。

总结

通过动态规划和贪心算法的结合,我们能够高效地解决这个问题,计算出一对景点的最高得分。这种方法不仅简洁,而且在实际应用中也非常实用。希望这篇文章能帮助你更好地理解和掌握这一技巧。如果你有任何问题或建议,欢迎在评论区留言讨论!