)
问题描述小R正在研究一组观光景点每个景点都有一个评分保存在数组values中其中values[i]表示第i个观光景点的评分。同时景点之间的距离由它们的下标差j - i表示其中i j。一对景点(i, j)满足i j的观光组合得分为values[i] values[j] i - j。这个公式等价于values[i] values[j] - (j - i)即两个景点的评分之和减去它们之间的距离。小R想知道在所有可能的景点组合中能够获得的最高观光组合得分是多少。输入格式输入为一个整数数组values表示各个景点的评分。输出格式输出一个整数表示最高观光组合得分。约束条件2 values.length 10^51 values[i] 1000程序代码#include stdio.hint maxScoreSightseeingPair(int* values, int valuesSize) {int max_i values[0] 0; // 初始为 values[0] 0int ans 0;for (int j 1; j valuesSize; j) {// 以 j 为右端点的最大得分int score max_i values[j] - j;if (score ans) {ans score;}// 更新 max_i为后续 j 做准备int cur_i values[j] j;if (cur_i max_i) {max_i cur_i;}}return ans;}int main() {int values1[] {8, 3, 5, 5, 6};int values2[] {10, 4, 8, 7};int values3[] {1, 2, 3, 4, 5};printf(%d\n, maxScoreSightseeingPair(values1, 5));printf(%d\n, maxScoreSightseeingPair(values2, 4));printf(%d\n, maxScoreSightseeingPair(values3, 5));return 0;}#include stdio.h int maxScoreSightseeingPair(int* values, int valuesSize) { int max_i values[0] 0; // 初始为 values[0] 0 int ans 0; for (int j 1; j valuesSize; j) { // 以 j 为右端点的最大得分 int score max_i values[j] - j; if (score ans) { ans score; } // 更新 max_i为后续 j 做准备 int cur_i values[j] j; if (cur_i max_i) { max_i cur_i; } } return ans; } int main() { int values1[] {8, 3, 5, 5, 6}; int values2[] {10, 4, 8, 7}; int values3[] {1, 2, 3, 4, 5}; printf(%d\n, maxScoreSightseeingPair(values1, 5)); printf(%d\n, maxScoreSightseeingPair(values2, 4)); printf(%d\n, maxScoreSightseeingPair(values3, 5)); return 0; }运行结果