想了很久,看了下题解顿悟了!赤裸裸的使用的博弈的原理,但是却用DP的方法记录状态。收获颇多。
/*
ID:bysen
LANG:C++
PROG:game1
*/
#include<stdio.h>
using namespace std;
int sum[101][101];
int dp[101][101];
int num[101];
int max( int a,int b ){ return a>b?a:b; }
int min( int a,int b ){ return a<b?a:b; }
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",&num[i] );
dp[i][i]=sum[i][i]=num[i];
}
for( int i=1;i<=n;i++ )
for( int j=i+1;j<=n;j++ )
sum[i][j]=sum[i][j-1]+sum[j][j];
for( int i=n-1;i>=1;i-- )
for( int j=i+1;j<=n;j++ )
dp[i][j]=sum[i][j]-min( dp[i+1][j],dp[i][j-1] );
/*
for( int i=1;i<=n;i++ )
{
for( int j=i+1;j<=n;j++ )
printf( "%d-%d:%d ",i,j,dp[i][j] );
printf( "\n" );
}
*/
printf( "%d %d\n",dp[1][n],sum[1][n]-dp[1][n] );
return 0;
}