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;
}
}