dp[l][r] = merge(dp[l][r-1], dp[l+1][r], compute(l, r))
 where  merge merges the best results of all subarrays, and  compute(l, r) computes the 
 value for  [l..r]. This guarantees that  dp[l][r] will track the best value from all 
 subarrays. For this DP to work, we iterate by length of the subarray.