rt,玄关
#include<bits/stdc++.h>
using namespace std;
int n, a[250], sum[250], dp_min[250][250], dp_max[250][250], s[250][250];
int main() {
memset(dp_min, INT_MAX, sizeof(dp_min)); // 初始化 dp_min 数组为最大值
memset(dp_max, INT_MIN, sizeof(dp_max)); // 初始化 dp_max 数组为最小值
cin >> n;
sum[0] = 0;
for (int i = 1; i <= n; i++) {
cin >> a[i];
sum[i] = sum[i - 1] + a[i]; // 计算前缀和
dp_min[i][i] = 0;
dp_max[i][i] = 0;
s[i][i] = i;
}
for (int l = 2; l <= n; l++) { // 枚举区间长度
for (int i = 1; i + l - 1 <= n; i++) { // 枚举区间起点
int j = i + l - 1; // 计算区间终点
for (int k = i; k < j; k++) { // 枚举合并点
int cc = sum[j] - sum[i - 1]; // 计算当前区间的石子总数
int mc = dp_min[i][k] + dp_min[k + 1][j] + cc; // 计算最小得分
int ac = dp_max[i][k] + dp_max[k + 1][j] + cc; // 计算最大得分
if (dp_min[i][j] > mc) { // 更新最小得分
dp_min[i][j] = mc;
s[i][j] = k;
}
if (dp_max[i][j] < ac) { // 更新最大得分
dp_max[i][j] = ac;
s[i][j] = k;
}
}
}
}
int ansMin = INT_MAX, ansMax = INT_MIN;
for (int i = 1; i <= n; i++) { // 枚举起始位置
ansMin = min(ansMin, dp_min[i][i + n - 1]); // 计算最小得分
ansMax = max(ansMax, dp_max[i][i + n - 1]); // 计算最大得分
}
cout << ansMin << endl;
cout << ansMax << endl;
return 0;
}