4
int solve(int i, int j, vector<int> &nums, vector<vector<int>> &dp) {6
if (dp[i][j] != -1) return dp[i][j];9
for (int k = i; k <= j; k++) {10
int cost = nums[i - 1] * nums[k] * nums[j + 1] + solve(i, k - 1, nums, dp) +11
solve(k + 1, j, nums, dp);12
maxcost = max(maxcost, cost);14
return dp[i][j] = maxcost;17
int maxCoins(vector<int> &nums) {18
nums.insert(nums.begin(), 1);21
vector<vector<int>> dp(n + 1, vector<int>(n + 1, -1));22
return solve(1, n - 2, nums, dp);26
int maxCoins(vector<int> &nums) {27
// including the nums[-1] == 1 and nums[n] == 129
nums.insert(nums.begin(), 1);31
vector<vector<int>> dp(nums.size() + 1, vector<int>(nums.size() + 1, 0));33
for (int len = 1; len <= n; ++len)34
for (int left = 1; left <= n - len + 1; ++left) {35
int right = left + len - 1;36
for (int k = left; k <= right; ++k)37
dp[left][right] = max(dp[left][right], nums[left - 1] * nums[k] * nums[right + 1] +38
dp[left][k - 1] + dp[k + 1][right]);