def solve():

    n = int(eval(input()))

    a = tuple(int(x) for x in input().split())



    memo = tuple([None] * n for _ in range(n))

    for i in range(n):

        memo[i][i] = a[i]



    for l in range(n - 2, -1, -1):

        for r in range(l + 1, n):

            memo[l][r] = max(a[r] - memo[l][r - 1], a[l] - memo[l + 1][r])



    print((memo[0][n - 1]))





if __name__ == '__main__':

    solve()



# [l,r]を

# l:=配列aの右端から左にシフト

# r:=lと一致する位置からn-1まで右にシフト

# と考えると、l==rは既にメモ化済みなので、l=n-2以前、r=l+1以降を調べればよい

# 漸化式で使う値は、

# lがより右にいるときの計算結果（前のループで計算済み）と

# rがより左にいるときの計算結果（一番左でもl==rなので計算済み）

# なので、参照する値がNoneになることはなく、Noneのチェックは不要になる



# enumerateを辞めた

n = int(eval(input()))

a = list(map(int, input().split()))

dp = [[0] * n for _ in range(n)]

for i in range(n):

    dp[i][i] = a[i]



for i in range(n - 2, -1, -1):

    for j in range(i + 1, n):

        dp[i][j] = max(a[i] - dp[i + 1][j], a[j] - dp[i][j - 1])



print((dp[0][n - 1]))



# 下記提出と全く同じ内容で提出します

# https://atcoder.jp/contests/dp/submissions/6590284



# これまでの連投で参考にしていたコード

# ほぼ同じ内容で提出しているつもりなのに、速度差が一向に縮まらない



# maxの引数の順番が自分と違うのが速度差の原因？

def solve():
    n = int(eval(input()))
    a = tuple(int(x) for x in input().split())
    memo = tuple([None] * n for _ in range(n))
    for i in range(n):
        memo[i][i] = a[i]
    for l in range(n - 2, -1, -1):
        for r in range(l + 1, n):
            memo[l][r] = max(a[r] - memo[l][r - 1], a[l] - memo[l + 1][r])
    print((memo[0][n - 1]))


if __name__ == "__main__":
    solve()
# [l,r]を
# l:=配列aの右端から左にシフト
# r:=lと一致する位置からn-1まで右にシフト
# と考えると、l==rは既にメモ化済みなので、l=n-2以前、r=l+1以降を調べればよい
# 漸化式で使う値は、
# lがより右にいるときの計算結果（前のループで計算済み）と
# rがより左にいるときの計算結果（一番左でもl==rなので計算済み）
# なので、参照する値がNoneになることはなく、Noneのチェックは不要になる
# enumerateを辞めた

n = int(eval(input()))
a = list(map(int, input().split()))
dp = [[0] * n for _ in range(n)]
for i in range(n):
    dp[i][i] = a[i]
for i in range(n - 2, -1, -1):
    for j in range(i + 1, n):
        dp[i][j] = max(a[i] - dp[i + 1][j], a[j] - dp[i][j - 1])
print((dp[0][n - 1]))
# 下記提出と全く同じ内容で提出します
# https://atcoder.jp/contests/dp/submissions/6590284
# これまでの連投で参考にしていたコード
# ほぼ同じ内容で提出しているつもりなのに、速度差が一向に縮まらない
# maxの引数の順番が自分と違うのが速度差の原因？

-def solve(): -    n = int(eval(input())) -    a = tuple(int(x) for x in input().split()) -    memo = tuple([None] * n for _ in range(n)) -    for i in range(n): -        memo[i][i] = a[i] -    for l in range(n - 2, -1, -1): -        for r in range(l + 1, n): -            memo[l][r] = max(a[r] - memo[l][r - 1], a[l] - memo[l + 1][r]) -    print((memo[0][n - 1])) - - -if __name__ == "__main__": -    solve() -# [l,r]を -# l:=配列aの右端から左にシフト -# r:=lと一致する位置からn-1まで右にシフト -# と考えると、l==rは既にメモ化済みなので、l=n-2以前、r=l+1以降を調べればよい -# 漸化式で使う値は、 -# lがより右にいるときの計算結果（前のループで計算済み）と -# rがより左にいるときの計算結果（一番左でもl==rなので計算済み） -# なので、参照する値がNoneになることはなく、Noneのチェックは不要になる -# enumerateを辞めた +n = int(eval(input())) +a = list(map(int, input().split())) +dp = [[0] * n for _ in range(n)] +for i in range(n): +    dp[i][i] = a[i] +for i in range(n - 2, -1, -1): +    for j in range(i + 1, n): +        dp[i][j] = max(a[i] - dp[i + 1][j], a[j] - dp[i][j - 1]) +print((dp[0][n - 1])) +# 下記提出と全く同じ内容で提出します +# https://atcoder.jp/contests/dp/submissions/6590284 +# これまでの連投で参考にしていたコード +# ほぼ同じ内容で提出しているつもりなのに、速度差が一向に縮まらない +# maxの引数の順番が自分と違うのが速度差の原因？