观光景点组合得分问题

64 阅读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

对题目初步理解:

小R研究观光景点组合得分,每个景点有评分,组合得分为两景点评分之和减去它们下标差,他想知道如何获得最高得分。

解题思路:

  1. 初始化一个变量 max_score 来记录最大得分,初始值为 Integer.MIN_VALUE

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

  3. 从第二个元素开始遍历数组:

    • 计算当前元素 j 的 values[j] - j
    • 计算当前组合的得分 max_i_plus_value + values[j] - j
    • 更新 max_score 为当前得分和 max_score 中的较大值。
    • 更新 max_i_plus_value 为 values[j] + j 和 max_i_plus_value 中的较大值。
  4. 遍历结束后,max_score 即为所求的最大得分。

关键点:

·彼此对比相减 ·计算二者距离(下标)

代码实现:

import java.util.Arrays;
 
public class Main {
    public static int solution(int[] values) {
        if(values.length==0||values==null||values.length==1){
            return 0;
        }
        int score=Integer.MIN_VALUE;
        
        //进行循环嵌套
        for(int i=0;i<values.length-1;i++){
            for(int j=i+1;j<values.length;j++){
                score=Math.max(score,values[i]+values[j]+i-j );
            }
        }
        
        return score; // 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);
    }
}

总结分析:

题目看似复杂,可以从样例入手,想想简单的实现算法和过程,并且做做计算;起手写的时候要根据刚刚计算过程来选择算法,选取需要的元素(因子),想好实现的条件(限制因素等等),要注意这里的距离是通过下标计算的,而下标的选取和长度有差别。