程序里有解释
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
int n;
int a[105], s[105]={0};
int f[105][105];
/*
f[i][j] 面对[i,j]的区间, 所能取得的最大值 显然后面对的,能取得的值就是s[j]-s[i - 1] - f[i][j]
f[i][j] 过后肯定是 f[i +1][j] f[i][j - 1]的局势
所以f[i][j] = max(s[j] - s[i] - f[i + 1][j] + a[i], s[j - 1] - s[i - 1] - f[i][j - 1] + a[j]);
f[i][i] = a[i]
*/
int main()
{
scanf("%d", &n);
for (int i = 1; i <= n; ++ i)
{
scanf("%d", &a[i]);
s[i] = s[i-1] + a[i];
f[i][i] = a[i];
}
for (int k = 1; k != n ; ++ k)
for (int i = 1; i + k <= n; ++ i)
{
int j = i + k;
f[i][j] = max(s[j] - s[i] - f[i + 1][j] + a[i], s[j - 1] - s[i - 1] - f[i][j - 1] + a[j]);
}
printf("%d %d\n", f[1][n], s[n] - f[1][n]);
return 0;
}
/*
6
4 7 2 9 5 2
*/