#include <iostream>
#include <bits/stdc++.h> 
typedef long long ll; 

using namespace std;
const int N = 3e3 + 5; 
struct info{
     ll x; 
     ll y; 
}; 
info dp[N][N][2]; 
bool vis[N][N][2]; 

int n; 
vector<ll>a; 
info solve(int l, int r, int t){
	info val; val.x = 0; val.y = 0; 
	if(l > r) return val; 
	if(vis[l][r][t]) return dp[l][r][t]; 
    vis[l][r][t] = 1; 

	if(t == 0){
        info op1; 
        info res = solve(l,r-1,1); 
        op1.x = a[r] + res.x; 
        op1.y = res.y; 
        info op2; 
        info res2 = solve(l+1,r,1); 
        op2.x = a[l] + res2.x; op2.y = res2.y; 
        ll op1dif = op1.x - op1.y; 
        ll op2dif = op2.x - op2.y; 
        if(op1dif >= op2dif) return dp[l][r][t] = op1; 
        else return dp[l][r][t] = op2; 
    }
    else {
        info op1; 
        info res = solve(l,r-1,0); 
        op1.y = a[r] + res.y; 
        op1.x = res.x; 
        info op2; 
        info res2 = solve(l+1,r,0); 
        op2.y = a[l] + res2.y; op2.x = res2.x; 
        ll op1dif = op1.x - op1.y; 
        ll op2dif = op2.x - op2.y; 
        if(op1dif <= op2dif) return dp[l][r][t] = op1; 
        else return dp[l][r][t] = op2; 
    }
}
int main() {
	ios_base::sync_with_stdio(false); 
    cin.tie(NULL); cout.tie(NULL); 
    memset(dp, -1, sizeof(dp)); 
    cin>>n; 
    a.resize(n); 
    for(int i = 0; i < n; i++) cin>>a[i]; 
    info ans = solve(0,n - 1, 0); 
    cout<<ans.x - ans.y<<endl; 
}