int maxCoins(vector<int>& nums) {
vector<int> p{1}; p.insert(p.end(), nums.begin(), nums.end()); p.push_back(1);
function<int(int, int)> solve = [&](int l, int r) -> int {
int best = 0;
for (int k = l + 1; k < r; k++) {
int coins = p[l] * p[k] * p[r] + solve(l, k) + solve(k, r);
best = max(best, coins);
}
return best;
};
return solve(0, (int)p.size() - 1);
}
public int maxCoins(int[] nums) {
int[] p = new int[nums.length + 2];
p[0] = p[p.length - 1] = 1;
for (int i = 0; i < nums.length; i++) p[i + 1] = nums[i];
return solve(p, 0, p.length - 1);
}
private int solve(int[] p, int l, int r) {
int best = 0;
for (int k = l + 1; k < r; k++) {
int coins = p[l] * p[k] * p[r] + solve(p, l, k) + solve(p, k, r);
best = Math.max(best, coins);
}
return best;
}
def max_coins(nums):
p = [1] + nums + [1]
def solve(l, r):
best = 0
for k in range(l + 1, r):
coins = p[l] * p[k] * p[r] + solve(l, k) + solve(k, r)
best = max(best, coins)
return best
return solve(0, len(p) - 1)
function maxCoins(nums: number[]): number {
const p = [1, ...nums, 1];
const solve = (l: number, r: number): number => {
let best = 0;
for (let k = l + 1; k < r; k++) {
const coins = p[l] * p[k] * p[r] + solve(l, k) + solve(k, r);
best = Math.max(best, coins);
}
return best;
};
return solve(0, p.length - 1);
}
int maxCoins(vector<int>& nums) {
vector<int> p{1}; p.insert(p.end(), nums.begin(), nums.end()); p.push_back(1);
vector<vector<int>> memo(p.size(), vector<int>(p.size(), -1));
function<int(int, int)> solve = [&](int l, int r) -> int {
if (r - l < 2) return 0;
if (memo[l][r] != -1) return memo[l][r];
int best = 0;
for (int k = l + 1; k < r; k++) {
int coins = p[l] * p[k] * p[r] + solve(l, k) + solve(k, r);
best = max(best, coins);
}
memo[l][r] = best;
return best;
};
return solve(0, (int)p.size() - 1);
}
public int maxCoins(int[] nums) {
int[] p = new int[nums.length + 2];
p[0] = p[p.length - 1] = 1;
for (int i = 0; i < nums.length; i++) p[i + 1] = nums[i];
int[][] memo = new int[p.length][p.length];
for (int[] row : memo) Arrays.fill(row, -1);
return solve(p, memo, 0, p.length - 1);
}
private int solve(int[] p, int[][] memo, int l, int r) {
if (r - l < 2) return 0;
if (memo[l][r] != -1) return memo[l][r];
int best = 0;
for (int k = l + 1; k < r; k++) {
int coins = p[l] * p[k] * p[r] + solve(p, memo, l, k) + solve(p, memo, k, r);
best = Math.max(best, coins);
}
memo[l][r] = best;
return best;
}
def max_coins(nums):
p = [1] + nums + [1]
memo = [[-1] * len(p) for _ in range(len(p))]
def solve(l, r):
if r - l < 2: return 0
if memo[l][r] != -1: return memo[l][r]
best = 0
for k in range(l + 1, r):
coins = p[l] * p[k] * p[r] + solve(l, k) + solve(k, r)
best = max(best, coins)
memo[l][r] = best
return best
return solve(0, len(p) - 1)
function maxCoins(nums: number[]): number {
const p = [1, ...nums, 1];
const memo = Array.from({ length: p.length }, () => new Array<number>(p.length).fill(-1));
const solve = (l: number, r: number): number => {
if (r - l < 2) return 0;
if (memo[l][r] !== -1) return memo[l][r];
let best = 0;
for (let k = l + 1; k < r; k++) {
const coins = p[l] * p[k] * p[r] + solve(l, k) + solve(k, r);
best = Math.max(best, coins);
}
memo[l][r] = best;
return best;
};
return solve(0, p.length - 1);
}
int maxCoins(vector<int>& nums) {
vector<int> p{1}; p.insert(p.end(), nums.begin(), nums.end()); p.push_back(1);
int n = p.size();
vector<vector<int>> dp(n, vector<int>(n, 0));
for (int gap = 2; gap < n; gap++) {
for (int l = 0; l + gap < n; l++) {
int r = l + gap;
for (int k = l + 1; k < r; k++) {
dp[l][r] = max(dp[l][r], dp[l][k] + p[l] * p[k] * p[r] + dp[k][r]);
}
}
}
return dp[0][n - 1];
}
public int maxCoins(int[] nums) {
int[] p = new int[nums.length + 2];
p[0] = p[p.length - 1] = 1;
for (int i = 0; i < nums.length; i++) p[i + 1] = nums[i];
int n = p.length;
int[][] dp = new int[n][n];
for (int gap = 2; gap < n; gap++) {
for (int l = 0; l + gap < n; l++) {
int r = l + gap;
for (int k = l + 1; k < r; k++) {
dp[l][r] = Math.max(dp[l][r], dp[l][k] + p[l] * p[k] * p[r] + dp[k][r]);
}
}
}
return dp[0][n - 1];
}
def max_coins(nums):
p = [1] + nums + [1]
n = len(p)
dp = [[0] * n for _ in range(n)]
for gap in range(2, n):
for l in range(0, n - gap):
r = l + gap
for k in range(l + 1, r):
dp[l][r] = max(dp[l][r], dp[l][k] + p[l] * p[k] * p[r] + dp[k][r])
return dp[0][n - 1]
function maxCoins(nums: number[]): number {
const p = [1, ...nums, 1];
const n = p.length;
const dp = Array.from({ length: n }, () => new Array<number>(n).fill(0));
for (let gap = 2; gap < n; gap++) {
for (let l = 0; l + gap < n; l++) {
const r = l + gap;
for (let k = l + 1; k < r; k++) {
dp[l][r] = Math.max(dp[l][r], dp[l][k] + p[l] * p[k] * p[r] + dp[k][r]);
}
}
}
return dp[0][n - 1];
}
int maxCoins(vector<int>& nums) {
vector<int> vals;
for (int v : nums) if (v > 0) vals.push_back(v);
int n = vals.size();
if (n == 0) return 0;
vector<long long> p(n + 2);
p[0] = p[n + 1] = 1;
for (int i = 0; i < n; i++) p[i + 1] = vals[i];
int w = n + 2;
vector<long long> dp((size_t)w * w, 0);
for (int l = n - 1; l >= 0; l--) {
for (int r = l + 2; r < w; r++) {
long long best = 0;
long long base = p[l] * p[r];
for (int k = l + 1; k < r; k++) {
long long v = dp[(size_t)l * w + k] + base * p[k] + dp[(size_t)k * w + r];
if (v > best) best = v;
}
dp[(size_t)l * w + r] = best;
}
}
return (int)dp[w - 1];
}
public int maxCoins(int[] nums) {
int[] vals = Arrays.stream(nums).filter(v -> v > 0).toArray();
int n = vals.length;
if (n == 0) return 0;
long[] p = new long[n + 2];
p[0] = p[n + 1] = 1;
for (int i = 0; i < n; i++) p[i + 1] = vals[i];
int w = n + 2;
long[] dp = new long[w * w];
for (int l = n - 1; l >= 0; l--) {
for (int r = l + 2; r < w; r++) {
long best = 0;
long base = p[l] * p[r];
for (int k = l + 1; k < r; k++) {
long v = dp[l * w + k] + base * p[k] + dp[k * w + r];
if (v > best) best = v;
}
dp[l * w + r] = best;
}
}
return (int) dp[w - 1];
}
def max_coins(nums):
vals = [v for v in nums if v > 0]
n = len(vals)
if n == 0: return 0
p = [1] + vals + [1]
w = n + 2
dp = [0] * (w * w)
for l in range(n - 1, -1, -1):
for r in range(l + 2, w):
best = 0
base = p[l] * p[r]
for k in range(l + 1, r):
v = dp[l * w + k] + base * p[k] + dp[k * w + r]
if v > best: best = v
dp[l * w + r] = best
return dp[w - 1]
function maxCoins(nums: number[]): number {
const vals = nums.filter((v) => v > 0);
const n = vals.length;
if (n === 0) return 0;
const p = new Array<number>(n + 2);
p[0] = p[n + 1] = 1;
for (let i = 0; i < n; i++) p[i + 1] = vals[i];
const w = n + 2;
const dp = new Array<number>(w * w).fill(0);
for (let l = n - 1; l >= 0; l--) {
for (let r = l + 2; r < w; r++) {
let best = 0;
const base = p[l] * p[r];
for (let k = l + 1; k < r; k++) {
const v = dp[l * w + k] + base * p[k] + dp[k * w + r];
if (v > best) best = v;
}
dp[l * w + r] = best;
}
}
return dp[w - 1];
}