import java.util.*; /** * NC326 能量项链 * @author d3y1 */ public class Solution { private final int MOD = 1000000007; /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param n int整型 * @param num int整型ArrayList * @return int整型 */ public int necklace (int n, ArrayList<Integer> num) { return solution(n, num); } /** * 动态规划 + 滑动窗口 * * dp[i][j]表示聚合区间[i,j]能量珠所能获得的最大能量 * * 水平化处理 * 1<=i<=n * pearls[i] = num.get(i-1) * pearls[i+n] = num.get(i-1) * * dp[i][j] = Math.max(dp[i][j], (dp[i][k]+dp[k+1][j]+pearls[i]*pearls[k+1]*pearls[j+1])%MOD) * * @param n * @param num * @return */ private int solution(int n, ArrayList<Integer> num){ int len = 2*n; // 水平化处理 关键! int[] pearls = new int[len+1]; for(int i=1; i<=n; i++){ pearls[i] = num.get(i-1); pearls[i+n] = num.get(i-1); } int[][] dp = new int[len+1][len+1]; // 滑动窗口 for(int gap=1; gap<n; gap++){ for(int i=1,j=i+gap; j<len; i++,j++){ for(int k=i; k<j; k++){ dp[i][j] = Math.max(dp[i][j], (dp[i][k]+dp[k+1][j]+pearls[i]*pearls[k+1]*pearls[j+1])%MOD); } } } int result = 0; for(int i=1; i<=n; i++){ // dp[1][4] dp[2][5] dp[3][6] dp[4][7] result = Math.max(result, dp[i][i+n-1]); } return result; } }