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

55 阅读3分钟

观光景点组合得分问题

问题描述

小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

解题思路:

问题理解

我们需要找到一对景点 (i, j) 使得 values[i] + values[j] + i - j 的值最大,其中 i < j。

数据结构选择 我们可以使用一个变量来记录当前的最大得分,并在遍历数组时更新这个变量。

算法步骤 初始化:

初始化一个变量 maxScore 来记录当前的最大得分,初始值为 0。

初始化一个变量 maxValue 来记录当前的最大 values[i] + i,初始值为 values[0] + 0。

遍历数组:

从第二个元素开始遍历数组。

对于每个元素 values[j],计算当前的得分 values[i] + values[j] + i - j,其中 i 是之前遍历过的元素中 values[i] + i 最大的那个。

更新 maxScore 为当前得分和 maxScore 中的较大值。

更新 maxValue 为 values[j] + j 和 maxValue 中的较大值。

返回结果:

遍历结束后,maxScore 即为所求的最大得分。

最终代码:

image.png

学习收获:

通过解决这道题目,我们可以学习到以下几方面的知识和技能:

  1. 问题分析能力:在解题过程中,我们需要将问题抽象为一个数学模型,即找到一对下标(i, j),使得特定表达式达到最大值。这锻炼了我们分析问题、提取关键信息的能力。
  2. 算法设计能力:在明确了问题模型后,我们需要设计一个高效的算法来解决问题。本题中,我们采用了动态规划的思想,通过一次遍历来求解最大得分,这锻炼了我们的算法设计能力。
  3. 代码实现能力:将算法转化为具体的代码实现,需要我们具备良好的编程基础。本题中,我们需要熟练掌握数组的遍历、变量的赋值和更新等基本操作。
  4. 空间复杂度优化:在原问题中,我们只需要记录当前的最大得分和最大 values[i] + i,而不需要保存所有可能的组合。这让我们学会了如何在保证时间复杂度的前提下,尽量降低空间复杂度。
  5. 逻辑思维能力:在解题过程中,我们需要清晰地思考每一步的操作及其背后的逻辑,确保算法的正确性。这锻炼了我们的逻辑思维能力。
  6. 数学建模能力:将实际问题转化为数学表达式,即 values[i] + values[j] + i - j,这要求我们具备一定的数学建模能力。
  7. 代码调试与优化:在实现代码的过程中,我们可能会遇到各种问题,需要通过调试来找出并解决这些问题。这个过程可以提高我们的代码调试和优化能力。