1. Recurrence
dp[i][j] = min_{i<=k<j} dp[i][k] + dp[k+1][j] + p[i]*p[k+1]*p[j+1]
Interval DP minimizing scalar multiplications by selecting optimal split point.
dp[i][j] cost
min over k
store k*
dp[i][j] = min_{i<=k<j} dp[i][k] + dp[k+1][j] + p[i]*p[k+1]*p[j+1]
Parenthesization built recursively: if split[i][j] = k then result = (solve(i,k))(solve(k+1,j)).