Interval DP
Time O(n³) Space O(n²)a = [1] + nums + [1]. For gap = 2.. length, dp[l][r] = max over l < k < r of dp[l][k] + dp[k][r] + a[l] a[k] a[r].
class Solution {
public int maxCoins(int[] nums) {
int n = nums.length + 2;
int[] a = new int[n];
a[0] = a[n - 1] = 1;
for (int i = 0; i < nums.length; i++) a[i + 1] = nums[i];
int[][] dp = new int[n][n];
for (int gap = 2; gap < n; gap++)
for (int l = 0; l + gap < n; l++) {
int r = l + gap;
for (int k = l + 1; k < r; k++)
dp[l][r] = Math.max(dp[l][r], dp[l][k] + dp[k][r] + a[l] * a[k] * a[r]);
}
return dp[0][n - 1];
}
}Verdict: The canonical interval DP.