program atcoder
    implicit none
    integer(8) :: i,j,n
    integer(8),allocatable,dimension(:,:) :: dpf,dps
    integer(8),allocatable,dimension(:) :: a
    read*,n
    allocate(dpf(0:n,0:n))
    allocate(dps(0:n,0:n))
    allocate(a(n))
    read(*,*)(a(i),i=1,n)

    ! dpf(i,j) := [i,j]の区間でゲームを行った際の先攻の人の得点
    ! dps(i,j) := [i,j]の区間でゲームを行った際の後攻の人の得点

    do i = 1,n
        dpf(i,i) = a(i)
        dps(i,i) = 0
        !区間が[i,i]の時、先攻はa[i]点、後攻の人は0点
    enddo
    

    do i = 1,n
        do j = 1,n-i
            
            ! 区間[j,i+j]で先攻の人の得点は 
            ! ( a(j)+区間[j+1,i+j]で後攻の人の得点 )　と　( a(j+i)+区間[j,i+j-1]で後攻の人の得点 ) の大きい方
            dpf(j,i+j) = max( dps(j+1,j+i)+a(j) , dps(j,j+i-1)+a(j+i) )

            ! 区間[j,i+j]で後攻の人の得点は 
            ! 先攻の人がa(j)を取った場合 -> 区間(j+1,i+j)の先攻の人の得点
            ! 先攻の人がa(i+j)を取った場合 -> 区間(j,i+j-1)の先攻の人の得点
            if( dps(j+1,j+i)+a(j) > dps(j,j+i-1)+a(j+i) )then
                dps(j,j+i) = dpf(j+1,j+i)
            else
                dps(j,j+i) = dpf(j,j+i-1)
            endif

        enddo
    enddo

    write(*,'(I0)')dpf(1,n)-dps(1,n)


    stop 
contains
end program atcoder
