#include <bits/stdc++.h>
#define ll long long
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
using namespace std;
template <typename T> using o_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
template <typename T, typename R> using o_map = tree<T, R, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
#define inf 1e9
#define MOD 1000000007
vector<vector < ll > > dp( 5001, vector<ll>(5001, -1));
vector  < ll > a ;
 ll n , sum  = 0 ;
ll find_max(ll left   , ll right , int player  ) {
    if (left ==  right ) {
        if (player == 0 ) return a[left] ;
        else return  0 ;
    }
    ll &p = dp[left][right]  ;
    if (p != -1 )return p   ;
    if (player  == 0 ) return  p = max ( a[left] + find_max (left +1 , right , 1    ) , a[right]  + find_max( left , right -1 ,  1) );
    return  p = min (  find_max (left +1 , right ,      0   ) ,   find_max( left , right -1 ,  0) );

}
void solve() {
    cin >> n ;
    a.assign (n + 1   ,  0 ) ;
    for (int i = 0 ; i < n ; i++) {
        cin >> a[i] ;
        sum+=a[i] ;
    }
    cout << find_max (0 , n-1  , 0 );


}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
#ifndef ONLINE_JUDGE
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
#endif
    ll t = 1;

    //cin >> t;
    while (t--) {
        solve();
    }
    return 0;
}