The twist

Naive forward DP is hard: bursting changes neighbors. Instead: think in reverse. Which balloon burst LAST in a range?

Advertisement

State

dp[i][j] = max coins from bursting balloons strictly between i and j (exclusive).

Advertisement

Transition

for (int len = 2; len <= n+1; len++)
  for (int i = 0; i + len <= n+1; i++) {
    int j = i + len;
    for (int k = i+1; k < j; k++)
      dp[i][j] = max(dp[i][j],
        dp[i][k] + dp[k][j] + nums[i]*nums[k]*nums[j]);
  }

Ghost balloons

Pad with 1s at both ends: [1, ...nums..., 1]. Simplifies boundary logic.