这道题算是USACO3.3里最水的一道了~~~1A啊~~思维也很简单~~从长度为1的一直推到长度为n的...
要更新长度为k的(l,r)的两人分数..首先看当前状态时谁来取..这里就和总个数做个差看下奇偶就可以了...具体更新到什么值就看(l+1,r)+data[l]与(l,r-1)+data[r]哪个更优~~
注意的是在更新时~~当前长度没更新的那个人的分数也要跟着传递~~
Program:
/*
ID: zzyzzy12
LANG: C++
TASK: game1
*/
#include<iostream>
#include<istream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stack>
#include<algorithm>
#include<queue>
#define oo 1000000000
#define ll long long
using namespace std;
int n,i,k,a[205],dp[205][205][2];
int main()
{
freopen("game1.in","r",stdin);
freopen("game1.out","w",stdout);
scanf("%d",&n);
for (i=1;i<=n;i++) scanf("%d",&a[i]);
memset(dp,0,sizeof(dp));
for (i=1;i<=n;i++)
dp[i][i][(n-1)%2]=a[i];
int x,y;
for (k=1;k<n;k++)
for (x=1;x<=n-k;x++)
{
y=x+k;
i=(n-k-1)%2;
dp[x][y][i]=dp[x+1][y][i]+a[x];
dp[x][y][1-i]=dp[x+1][y][1-i];
if (dp[x][y][i]<dp[x][y-1][i]+a[y])
{
dp[x][y][i]=dp[x][y-1][i]+a[y];
dp[x][y][1-i]=dp[x][y-1][1-i];
}
}
printf("%d %d\n",dp[1][n][0],dp[1][n][1]);
return 0;
}