问题描述
小R正在研究一组观光景点,每个景点都有一个评分,保存在数组 values 中,其中 values[i] 表示第 i 个观光景点的评分。同时,景点之间的距离由它们的下标差 j - i 表示。
一对景点 (i < j) 的观光组合得分为 values[i] + values[j] + i - j,也就是两者评分之和减去它们之间的距离。
小R想知道,在哪种情况下能够获得观光景点组合的最高得分。
使用算法
暴力枚举
算法思路
-
初始化变量:
- 定义一个变量
ans,用于存储观光组合的最高得分,初始值为0。
- 定义一个变量
-
遍历数组:
- 使用一个双重循环来遍历所有可能的景点对(i, j),其中i < j。
- 外层循环从i = 0到i = values.length - 2。
- 内层循环从j = i + 1到j = values.length - 1。
-
计算得分:
- 对于每一对景点(i, j),计算得分
values[i] + values[j] + i - j。
- 对于每一对景点(i, j),计算得分
-
更新最高得分:
- 使用
Math.max函数来比较当前得分和ans,并将较大的值赋给ans。
- 使用
-
返回结果:
solution函数返回ans,即观光组合的最高得分。
代码展示
import java.util.Arrays;
public class Main {
public static int solution(int[] values) {
int ans = 0;
for (int i = 0; i < values.length - 1; i++) {
for (int j = i + 1; j < values.length; j++) {
ans = Math.max(ans, values[i] + values[j] + i - j);
}
}
// write code here
return ans; // Placeholder return
}
public static void main(String[] args) {
System.out.println(solution(new int[] { 8, 3, 5, 5, 6 }) == 11 ? 1 : 0);
System.out.println(solution(new int[] { 10, 4, 8, 7 }) == 16 ? 1 : 0);
System.out.println(solution(new int[] { 1, 2, 3, 4, 5 }) == 8 ? 1 : 0);
}
}