#define ll long long
#define pub push_back
#define pob pop_back
#define puf push_front
#define pof pop_front
#define mp make_pair
#define fo(i , n) for(ll i = 0 ; i < n ; i++)
//#include<bits/stdc++.h>
#include<iomanip>
#include<cmath>
#include<cstdio>
#include<utility>
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
#include<map>
#include<queue>
#include<set>
#include<stack>
ll pi = acos(-1) ;
ll z =  1000000007 ;
ll inf = 6000000000000000000 ;
ll p1 = 37 ;
ll p2 = 53 ;
ll mod1 =  202976689 ;
ll mod2 =  203034253 ;
ll gcd(ll a , ll b){ if(b > a) return gcd(b , a) ; if(b == 0) return a ; return gcd(b , a%b) ;}
ll power(ll a ,ll b , ll p){if(b == 0) return 1 ; ll c = power(a , b/2 , p) ; if(b%2 == 0) return ((c*c)%p) ; else return ((((c*c)%p)*a)%p) ;}
ll inverse(ll a ,ll n){return power(a , n-2 , n) ;}
ll max(ll a , ll b){if(a > b) return a ; return b ;}
ll min(ll a , ll b){if(a < b) return a ; return b ;}
ll left(ll i){return ((2*i)+1) ;}
ll right(ll i){return ((2*i) + 2) ;}
void swap(ll&a , ll&b){ll c = a ; a = b ; b = c ; return ;}
//ios_base::sync_with_stdio(0);
//cin.tie(0); cout.tie(0);
using namespace std ;
#include <ext/pb_ds/assoc_container.hpp> 
#include <ext/pb_ds/tree_policy.hpp> 
using namespace __gnu_pbds; 
#define ordered_set tree<int, null_type,less<int>, rb_tree_tag,tree_order_statistics_node_update>
// ordered_set s ; s.order_of_key(val)  no. of elements strictly less than val
// s.find_by_order(i)  itertor to ith element (0 indexed)
//__builtin_popcount(n) -> returns number of set bits in n

 
void solve()
{
    ll n ;
    cin >> n ;
    ll arr[n] ;
    fo(i , n)
    {
    	cin >> arr[i] ;
    }
    ll dp[n][2] ;
    fo(i,  n)
    {
    	dp[i][0] = dp[i][1] = (-1 * inf);
    }
    dp[0][0] = dp[1][0] = 0 ;
    dp[0][1] = arr[0] ;
    dp[1][1] = arr[1] ;


    for(ll i = 2 ; i < n ; i++)
    {
    	for(ll j = i-2 ; j >= 0 ; j--)
    	{
    		if((j/2) == (i/2))
    			dp[i][0] = max(dp[i][0] , dp[j][0]) ;
    		if(((j/2) + 1) == (i/2))
    			dp[i][0] = max(dp[i][0] , dp[j][0] + arr[i]) ;
    		if(((j/2) + 1) == ((i/2) + 1))
    			dp[i][1] = max(dp[i][1] , dp[j][0] + arr[i]) ;

    		if(((j/2) + 1) < (i/2))
    			break ;
    	}
    	for(ll j = i-2 ; j >= 0 ; j--)
    	{
    		if(((j/2) + 2) < (i/2))
    			break ;
    		if(((j/2) + 1) == (i/2))
    			dp[i][0] = max(dp[j][1] , dp[i][0]) ;
    		if(((j/2) + 2) == (i/2))
    			dp[i][0] = max(dp[i][0] , dp[j][1] + arr[i]) ;
    		if(((j/2) + 1) == ((i/2) + 1))
    			dp[i][1] = max(dp[j][1] , dp[i][1]) ;
    		if(((j/2) + 2) == ((i/2)+1))
    			dp[i][1] = max(dp[i][1] , dp[j][1] + arr[i]) ;

    	}
    }
    ll fin_ans = -1 * inf ;
    fo(i , n)
    {
    	if((i/2) == (n/2))
    		fin_ans = max(fin_ans , dp[i][0]) ;
    	if(((i/2) + 1) == (n/2))
    		fin_ans = max(fin_ans , dp[i][1]) ;
    }
    cout << fin_ans << endl ;
    return ;
}
 
int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
   /* #ifndef ONLINE_JUDGE
    freopen("inputf.txt" , "r" , stdin) ;
    freopen("outputf.txt" , "w" , stdout) ;
    freopen("error.txt" , "w" , stderr) ;
    #endif*/
    
    ll t ;
    //cin >> t ;
    t = 1 ;
   
    while(t--)
    {
        solve() ;
    }
    cerr << "Time : " << 1000 * ((double)clock()) / (double)CLOCKS_PER_SEC << "ms\n";
 
    return 0;
}

Measured memory_bytes: 8508