2
int solve(int[] v, int i, int j) {3
if (i + 1 == j) return 0;4
int ans = Integer.MAX_VALUE;5
for (int k = i + 1; k < j; k++) {6
ans = Math.min(ans, (v[i] * v[j] * v[k] + solve(v, i, k) + solve(v, k, j)));11
int solveMem(int[] v, int i, int j, int[][] dp) {12
if (i + 1 == j) return 0;14
if (dp[i][j] != -1) return dp[i][j];16
int ans = Integer.MAX_VALUE;18
for (int k = i + 1; k < j; k++) {19
ans = Math.min(ans, (v[i] * v[j] * v[k] + solveMem(v, i, k, dp) + solveMem(v, k, j, dp)));25
int solveTab(int[] v) {27
int[][] dp = new int[n][n];29
for (int i = n - 1; i >= 0; i--) {30
for (int j = i + 2; j < n; j++) {32
int ans = Integer.MAX_VALUE;33
for (int k = i + 1; k < j; k++) {34
ans = Math.min(ans, (v[i] * v[j] * v[k] + dp[i][k] + dp[k][j]));43
public int minScoreTriangulation(int[] values) {44
int n = values.length;45
// return solve(values, 0, n-1); // For Recursion47
/* int[][] dp= new int[n][n]; // For Top-Down DP(Memoisation)52
return solveMem(values,0,n-1,dp);55
return solveTab(values); // For Bottom-Down DP(Tabulisation)