#include #include #include using namespace std; int N; int v[11234]; long long dp[11234][2]; long long solve(int i, int j) { if (i > j) { return 0; } if (dp[i][j] != -1) { return dp[i][j]; } long long &ret = dp[i][j]; ret = max(v[i] + min(solve(i + 1, j - 1), solve(i + 2, j)), v[j] + min(solve(i + 1, j - 1), solve(i, j - 2))); return ret; } bool read() { if (scanf("%d", &N) == EOF) { return false; } for (int i = 0; i < N; i++) { scanf("%d", &v[i]); } return true; } void process() { for (int i = 0; i < N - 1; i++) { dp[i][0] = max(v[i], v[i + 1]); } int turn = 0; int pastTurn = 1; for (int intervalSize = 4; intervalSize <= N; intervalSize += 2) { pastTurn = turn; turn = turn ^ 1; for (int i = 0, j = intervalSize - 1; j < N; i++, j++) { dp[i][turn] = max(v[i] + min(dp[i + 1][pastTurn], dp[i + 2][pastTurn]), v[j] + min(dp[i][pastTurn], dp[i + 1][pastTurn])); } } printf ("%lld\n", dp[0][turn]); } int main() { while (read()) { process(); } return 0; }