/* ID: majunch2 LANG: C++ PROG: game1 */ // usaco 3.3.5 /* 设 F1[I,J] 为第一个人(先行者) 从I 取到 J 的最大分数 F2[I,J] 为第二个人(先行者) 从I 取到 J 的最大分数 S[I] 为 第 I 张牌的分数..... Sum[I] 为第 1 到第 I 张牌的分数总和.... F1[I,J]=max{ F2[I+1,J]+S[I] , F2[I,J-1]+S[J] } F2[I,J]=Sum[J]-Sum[I-1]-F1[I,J] */ #include <cstdio> #include <cstdlib> #include <cstring> //#include <cmath> //#include <algorithm> //#include <ctime> //using namespace std; const int inf = 99999; int min(int a,int b,int c) { if (a<b) b=a; return b<c?b:c; } int max(int a,int b) { return a>b?a:b; } int s[110]; int sum[110]; int dp1[110][110]; int dp2[110][110]; int main() { //freopen("game1.in","r",stdin); //freopen("game1.out","w",stdout); int n; scanf("%d",&n); for (int i=1;i<=n;i++) { scanf("%d",&s[i]); sum[i]=sum[i-1]+s[i]; } for (int len=1;len<=n;len++) for (int i=1;i<=n-len+1;i++) { int j=i+len-1; dp1[i][j]=max(s[i]+dp2[i+1][j],dp2[i][j-1]+s[j]); dp2[i][j]=sum[j]-sum[i-1]-dp1[i][j]; } printf("%d %d/n",dp1[1][n],sum[n]-dp1[1][n]); return 0; }