#include
using namespace std;
const int N = 300;
//相当于1 * 2^30, << 是左移位运算,每次都移动一位都相当于×2
const int INF = 1 << 30;
int n, dp[N][N], dp2[N][N];
int sum[N], s[N];
int main()
{
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> s[i];
//为n~2n的前缀和做准备
s[i + n] = s[i];
}
// n * 2 是因为要化环为链
for(int i = 1; i <= n * 2; i++)
{
//求前缀和,sum[i, j] -> sum[i][i - j + 1] -> sum[j] - sum[i - 1];
sum[i] = s[i] + sum[i - 1];
//虽然已经全局初始化为0了但是题解还是写下吧
dp[i][i] = 0; dp2[i][i] = 0;
}
//len:i 到 j 的距离
for(int len = 1; len < n; len++)
{
//从第 i 堆开始
for (int i = 1; i <= (n * 2 - len); i++)
{
//到第 j 堆结束
int j = i + len;
//初始化求最小的区间和为 INF(因为一开始是 0 ,不放大就一直是 0 了)
dp[i][j] = INF;
// i 和 j 之间用 k 分割
for(int k = i; k < j; k++)
{
//第 i 堆到第 j 堆的合并
dp[i][j] = min (dp[i][j], dp[i][k] + dp[k + 1][j] + sum[j] - sum[i - 1]);
dp2[i][j] = max (dp2[i][j], dp2[i][k] + dp2[k + 1][j] + sum[j] - sum[i - 1]);
}
}
}
//看化为链的环中哪点为起点时有最大值或最小值
int ans = INF, ans2 = 0;
for(int i = 1; i <= n; i++)
{
//i为起点 j = i + n - 1 ,len = i + j = n
ans = min(ans, dp[i][i + n - 1]);
ans2 = max(ans2,dp2[i][i + n - 1]);
}
cout << ans << endl << ans2;
}