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 取模后的值。