2
public int maxCoins(int[] nums) {5
// adding 1 to the front and back6
int[] temp = new int[n + 2];8
for (int i = 1; i < temp.length - 1; i++) {11
temp[temp.length - 1] = 1;15
int[][] dp = new int[n + 1][n + 1];16
for (int[] row : dp) {21
return f(1, n, nums, dp);24
int f(int i, int j, int[] a, int[][] dp) {26
if (dp[i][j] != -1) return dp[i][j];28
int max = Integer.MIN_VALUE;29
for (int n = i; n <= j; n++) {30
int coins = a[i - 1] * a[n] * a[j + 1] + f(i, n - 1, a, dp) + f(n + 1, j, a, dp);31
max = Math.max(max, coins);33
return dp[i][j] = max;37
// Time Complexity: O(N * N * N) ~ O(N^3);38
// Space Complexity: O(N^2) + O(N);