inlineintread() { int a = 1,b = 0; char c; do {c=getchar(); if (c == '-') a = -1;} while (c < '0' c > '9'); do {b = b * 10 + c - '0'; c = getchar();} while (c >= '0' && c <= '9'); return a * b; }
int a[1010]; int sum[1010]; int dp[1010][1010];
intmain() { int T = read(); while (T--) { int n = read(); for (int i = 1; i <= n; ++i) { a[i] = read(); sum[i] = sum[i - 1] + a[i]; } for (int len = 1; len <= n; ++len) { for (int l = 1, r = len; r <= n; ++l, ++r) { dp[l][r] = sum[r] - sum[l - 1]; for (int i = l + 1; i <= r; ++i) { dp[l][r] = max(dp[l][r], sum[i - 1] - sum[l - 1] - dp[i][r]); } for (int i = r - 1; i >= l; --i) { dp[l][r] = max(dp[l][r], sum[r] - sum[i] - dp[l][i]); } } } printf("%d\n", (sum[n] + dp[1][n]) / 2); } return0; }
inlineintread() { int a = 1,b = 0; char c; do { c=getchar(); if (c == '-') a = -1; } while (c < '0' c > '9'); do { b = b * 10 + c - '0'; c = getchar(); } while (c >= '0' && c <= '9'); return a * b; }
constint MAXN = 1010; int a[MAXN], sum[MAXN], dp[MAXN][MAXN]; int lft[MAXN][MAXN], rigt[MAXN][MAXN];
intmain() { int T = read(); while (T--) { int n = read(); for (int i = 1; i <= n; ++i) { a[i] = read(); sum[i] = sum[i - 1] + a[i]; } memset(dp, 0, sizeof(dp)); memset(lft, 0, sizeof(lft)); memset(rigt, 0, sizeof(rigt)); for (int i = 1; i <= n; ++i) { dp[i][i] = a[i]; lft[i][i] = sum[i - 1] - dp[i][i]; rigt[i][i] = dp[i][i] + sum[i]; } for (int len = 2; len <= n; ++len) { for (int l = 1, r = len; r <= n; ++l, ++r) { dp[l][r] = sum[r] - sum[l - 1]; dp[l][r] = max(dp[l][r], lft[l + 1][r] - sum[l - 1]); dp[l][r] = max(dp[l][r], sum[r] - rigt[l][r - 1]); lft[l][r] = max(lft[l + 1][r], sum[l - 1] - dp[l][r]); rigt[l][r] = min(rigt[l][r - 1], dp[l][r] + sum[r]); } } printf("%d\n", (dp[1][n] + sum[n]) / 2); } return0; }