import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int[] h = new int[n];
for (int i = 0; i < n; i++) {
h[i] = in.nextInt();
}
final int MOD = 1000000007;
int size = 2 * n;
long[][] dp = new long[size][size];
for (int l = 2; l <= n; l++) {
for (int i = 0; i <= size - l; i++) {
int j = i + l - 1;
for (int k = i; k < j; k++) {
int current = h[i % n] * h[(k + 1) % n] * h[(j + 1) % n];
dp[i][j] = Math.max(dp[i][j], dp[i][k] + dp[k + 1][j] + current);
}
}
}
long max = 0;
for (int i = 0; i < n; i++) {
int j = i + n - 1;
if (j >= size) {
continue;
}
if (dp[i][j] > max) {
max = dp[i][j];
}
}
System.out.println(max % MOD);
}
}
https://www.nowcoder.com/discuss/727521113110073344
思路:
- 输入处理:读取珠子数量 n 和每个珠子的头标记值。
- 动态规划数组初始化:dp[i][j] 表示合并从 i 到 j 的珠子的最大能量。
- 动态规划填充:遍历所有可能的区间长度,计算每个区间的最大能量。
- 结果查找:遍历所有可能的起点,找到长度为 n 的区间的最大能量值,并输出结果对 10^9 + 7 取模后的值。



京公网安备 11010502036488号