Question
Please help me code this in C++
Sample Input:
1
4
1 2 3 4
Sample Output:
16

Here is the detailed and simplified C++ code for the above listed problem statement:
C++ Code:
#include <bits/stdc++.h>
#define fastIo ios_base::sync_with_stdio(false), cin.tie(NULL), cout.tie(NULL)
#define all(v) (v).begin(), (v).end()
#define rall(v) (v).rbegin(), (v).rend()
#define fi first
#define se second
#define sz size
#define pb push_back
#define mp make_pair
using namespace std;
const double EPS = 1e-9;
const double PI = 3.141592653589793238462;
const int dr[] = {1, 1, 0, -1, -1, -1, 0, 1};
const int dc[] = {0, 1, 1, 1, 0, -1, -1, -1};
const int dx[] = {1, 0, -1, 0};
const int dy[] = {0, 1, 0, -1};
typedef long long ll;
ll a[65], minR[65][65], sum[65][65];
ll dp[65][65];
ll getMin(int i, int j) {
if (i > j) return -1000000000LL * 60LL - 1LL;
return minR[i][j];
}
ll solve(int lef, int rig) {
if (lef + 1 == rig) {
return minR[lef][rig] * 2;
}
if (dp[lef][rig] != -1000000000LL * 60LL - 1LL) {
return dp[lef][rig];
}
ll ret = minR[lef][rig] * (rig - lef + 1);
for (int l = lef + 1; l < rig; l++) {
ret = max(ret, solve(l, rig) + min(minR[lef][l - 1], sum[l][rig]) * ((l - 1) - lef + 1 + 1));
ret = max(ret, solve(lef, l) + min(minR[l + 1][rig], sum[lef][l]) * (rig - (l + 1) + 1 + 1));
for (int r = l + 1; r < rig; r++) {
ll cur = solve(lef, l) + solve(r, rig);
if (r == l + 1) {
ll add = min(sum[lef][l], sum[r][rig]);
ret = max(ret, cur + 2 * add);
} else {
ll add = min(sum[lef][l], min(sum[r][rig], getMin(l + 1, r - 1)));
ret = max(ret, cur + (r - 1 - (l + 1) + 1 + 2) * add);
}
}
}
return dp[lef][rig] = ret;
}
void solve() {
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
for (int i = 1; i <= n; i++) {
minR[i][i] = sum[i][i] = a[i];
for (int j = i + 1; j <= n; j++) {
minR[i][j] = min(minR[i][j - 1], a[j]);
sum[i][j] = sum[i][j - 1] + a[j];
}
}
for (int i = 1; i < 65; i++) {
for (int j = 1; j < 65; j++) {
dp[i][j] = -1000000000LL * 60LL - 1LL;
}
}
cout << solve(1, n) << '\n';
}
int main() {
fastIo;
int t; cin >> t;
while (t--) {
solve();
}
return 0;
}
Output: