//区间dp和简单博弈组合
#include<stdio.h>
#include<string.h>
int dp[1100][1100][2];//dp[i][j][1]表示在区间[i,j]先取数的人在所有数都被取完时得到的最优情况 dp[i][j][0]后取数的人在所有数都被取完时得到的最优情况
int n;
int a[1100];
int min(int a,int b){return a<b?a:b;}
int max(int a,int b){return a>b?a:b;}
void init()
{
memset(dp,0,sizeof(dp));
int i;
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
}
int solve()
{
int i,j,k;
for(i=n;i>=1;i--)
{
for(j=i;j<=n;j++)
{
if(i==j)
{
dp[i][j][0]=0;
dp[i][j][1]=a[i];
continue;
}
dp[i][j][1]=max(dp[i+1][j][0]+a[i],dp[i][j-1][0]+a[j]);//先取数的人把两端的数中的一个取走在剩余的区间中他变成了后取数的人
dp[i][j][0]=min(dp[i+1][j][1],dp[i][j-1][1]);//当前区间如果这个人后取数则另一个人会按最优情况取数 那么对方取完数剩余给当前取数的人最差的情况
}
}
return dp[1][n][1]-dp[1][n][0];
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
init();
int ans=solve();
printf("%d\n",ans);
}
return 0;
}
#include<stdio.h>
#include<string.h>
int dp[1100][1100][2];//dp[i][j][1]表示在区间[i,j]先取数的人在所有数都被取完时得到的最优情况 dp[i][j][0]后取数的人在所有数都被取完时得到的最优情况
int n;
int a[1100];
int min(int a,int b){return a<b?a:b;}
int max(int a,int b){return a>b?a:b;}
void init()
{
memset(dp,0,sizeof(dp));
int i;
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
}
int solve()
{
int i,j,k;
for(i=n;i>=1;i--)
{
for(j=i;j<=n;j++)
{
if(i==j)
{
dp[i][j][0]=0;
dp[i][j][1]=a[i];
continue;
}
dp[i][j][1]=max(dp[i+1][j][0]+a[i],dp[i][j-1][0]+a[j]);//先取数的人把两端的数中的一个取走在剩余的区间中他变成了后取数的人
dp[i][j][0]=min(dp[i+1][j][1],dp[i][j-1][1]);//当前区间如果这个人后取数则另一个人会按最优情况取数 那么对方取完数剩余给当前取数的人最差的情况
}
}
return dp[1][n][1]-dp[1][n][0];
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
init();
int ans=solve();
printf("%d\n",ans);
}
return 0;
}