題目描述
給定一個長爲n的整數序列(n<=1000),由A和B輪流取數(A先取)。每個人可從序列的左端或右端取若干個數(至少一個),但不能兩端都取。所有數都被取走後,兩人分別統計所取數的和作爲各自的得分。假設A和B都足夠聰明,都使自己得分儘量高,求A的最終得分。
輸入輸出格式
輸入格式:
第一行,一個正整數T,表示有T組數據。(T<=100)
接着T行,每行第一個數爲n,接着n個整數表示給定的序列.
輸出格式:
輸出T行,每行一個整數,表示A的得分
輸入輸出樣例
輸入樣例#1:
2
1 -1
2 1 2
輸出樣例#1:
-1
3
說明
時限:3s
#include <bits/stdc++.h>
using namespace std;
int a[1010],sum[1010];
int dp[1010][1010];
int wzx[1010][1010],ljy[1010][1010];
int t,n;
int main() {
cin>>t;
while (t--) {
cin>>n;
for (int i=1;i<=n;i++) cin>>a[i],sum[i]=sum[i-1]+a[i];
for (int i=1;i<=n;i++) dp[i][i]=wzx[i][i]=ljy[i][i]=a[i];
for (int l=2;l<=n;l++)
for (int i=1;i<n;i++) {
int j=i+l-1; if (j>n) break;
int kkk=sum[j]-sum[i-1];
dp[i][j]=kkk-min(0,min(wzx[i][j-1],ljy[i+1][j]));
wzx[i][j]=min(wzx[i][j-1],dp[i][j]);
ljy[i][j]=min(ljy[i+1][j],dp[i][j]);
}
printf("%d\n",dp[1][n]);
}
return 0;
}