观光景点组合得分问题 | 豆包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) 的最高得分。具体思路如下:
- 初始化:定义两个变量
max_i_plus_values和max_score,分别表示当前最大values[i] + i和当前最高得分。初始时,max_i_plus_values为values[0] + 0,max_score为values[0] + values[1] + 0 - 1。 - 遍历每个景点:从第 1 个景点开始,遍历每个景点
j。 - 计算当前得分:对于每个景点
j,计算values[j] - j,并更新max_score。 - 更新最大值:更新
max_i_plus_values,确保它始终为当前最大values[i] + i。 - 返回结果:最终返回
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),我们只使用了常数级的额外空间。
总结
通过动态规划和贪心算法的结合,我们能够高效地解决这个问题,计算出一对景点的最高得分。这种方法不仅简洁,而且在实际应用中也非常实用。希望这篇文章能帮助你更好地理解和掌握这一技巧。如果你有任何问题或建议,欢迎在评论区留言讨论!