#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define INF 0x3f3f3f3f
#define EXP 1e-8
#define UP(i,x,e) for(i=x;i<e;i++)
#define DOWN(i,x,e) for(i=x;i>e;i--)
#define Max(a,b,c) max(a,max(b,c))
#define Men(name,num) memset(name,num,sizeof(name))
const int maxn=25;
int T,N,a[maxn],b[maxn],dp[maxn][maxn][maxn][maxn];
int DFS(int fs,int fe,int ss,int se,int sum) {
if(fs>fe&&ss>se)return 0;//当两个都达到了都没得选了,就返回零表示剩下的卡的值为零
if(dp[fs][fe][ss][se])return dp[fs][fe][ss][se];//已经存在,直接返回
int curmax=0;
if(fs<=fe) {
curmax=max(curmax,sum-DFS(fs+1,fe,ss,se,sum-a[fs]));//由于得到是当前最优解
curmax=max(curmax,sum-DFS(fs,fe-1,ss,se,sum-a[fe]));
}
if(ss<=se) {
curmax=max(curmax,sum-DFS(fs,fe,ss+1,se,sum-b[ss]));
curmax=max(curmax,sum-DFS(fs,fe,ss,se-1,sum-b[se]));
}
return dp[fs][fe][ss][se]=curmax;
}
int main() {
#ifndef ONLINE_JUDGE
freopen("D://imput.txt","r",stdin);
#endif // ONLINE_JUDGE
scanf("%d",&T);
while(T--) {
int sum=0;
scanf("%d",&N);
Men(dp,0);
for(int i=1; i<=N; i++) {
scanf("%d",&a[i]);
sum+=a[i];
}
for(int j=1; j<=N; j++) {
scanf("%d",&b[j]);
sum+=b[j];
}
printf("%d\n",DFS(1,N,1,N,sum));
}
}
HDU 4597 H - Play Game
最新推荐文章于 2020-08-09 20:49:48 发布