import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] nums = new int[2 * n];
for (int i = 0; i < n; i++){
nums[i] = sc.nextInt();
nums[i + n] = nums[i];
}
// dp[1][r] 表示在区间[1][r] 内完成跳跃所能获得的最高分
long[][] dp = new long[2 * n][2 * n];
// 初始化:单个点,第一步
for (int i = 0; i < 2 * n; i++) {
dp[i][i] = nums[i];
}
// 枚举区间的长度 从 2 到 n
for (int len = 2; len <= n; len++) {
// 枚举左端点1eft
for (int left = 0; left <= 2 * n - len; left++) {
int right = left + len - 1;
// 两种情况:最后一步(len)跳左边,最后一步(len)跳右边
long option1 = dp[left + 1][right] + (long) len * nums[left];
long option2 = dp[left][right - 1] + (long) len * nums[right];
dp[left][right] = Math.max(option1, option2);
}
}
// 在所有长度为 n 的区间中找到最大值
long ans = 0;
for (int i = 0; i < n; i++) {
ans = Math.max(ans, dp[i][i + n - 1]);
}
System.out.println(ans);
}
}
这是一道动态规划问题
步骤一:初始化第一跳的得分,第一部的得分是固定的,就是每个格子的分数
步骤二:第二跳的得分根据第一跳的得分,再加上第二跳的得分就是第二跳的总得分,但是第二跳可能是跳左边或者跳右边,进行判断,看看哪一跳的总得分相加更高
依次类推,最后在根据间隔为【n - 1】判断跳了n次总得分哪个最高

京公网安备 11010502036488号