两个人分别从一个数组两边选数,都考虑让自己的最优情况,如果A先选,A能选到的最大和是多少
#include <bits/stdc++.h>
using namespace std;
#define RE(x) freopen(x,"r",stdin)
#define WR(x) freopen(x,"w",stdout)
#define INF 0x3f3f3f3f
#define CLEAR(x) memset(x,0,sizeof(x))
#define pb push_back
#define mp make_pair
typedef long long ll;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef pair<int,int> pii;
const int M = 1e9+7;
const double PI = acos(-1.0);
const double eps = 1e-8;
int dp[555][555];//dp[i][j]代表只剩从i到j的区间时A选到的最大值。
int T,n;
int a[555];
int main() {
//RE("in.txt");WR("out.txt");
cin>>T;
for(int i=1;i<=T;i++) {
cin>>n;
int sum = 0;
for(int i=0;i<n;i++) {
cin>>a[i];
sum+=a[i];
}
memset(dp,0,sizeof(dp));
//dfs(0,n-1,1);
if(n&1) {
for(int i=0;i<n;i++) {
dp[i][i]=a[i];
}
}
for(int i=1;i<n;i++) {
for(int j=0;j+i<n;j++) {
if(((n+i)&1)==0) {
dp[j][j+i]=min(dp[j+1][j+i],dp[j][j+i-1]);
}
else {
dp[j][j+i]=max(dp[j+1][j+i]+a[j],dp[j][j+i-1]+a[j+i]);
}
}
}
cout<<"Case #"<<i<<": "<<dp[0][n-1]<<" "<<sum-dp[0][n-1]<<endl;
}
}