标签:dfs+记忆化
2 1 23 53 3 10 100 20 2 4 3
53 105
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<set>
#include<map>
#define L(x) (x<<1)
#define R(x) (x<<1|1)
#define MID(x,y) ((x+y)>>1)
#define eps 1e-8
typedef __int64 ll;
#define fre(i,a,b) for(i = a; i <b; i++)
#define free(i,b,a) for(i = b; i >= a;i--)
#define mem(t, v) memset ((t) , v, sizeof(t))
#define ssf(n) scanf("%s", n)
#define sf(n) scanf("%d", &n)
#define sff(a,b) scanf("%d %d", &a, &b)
#define sfff(a,b,c) scanf("%d %d %d", &a, &b, &c)
#define pf printf
#define bug pf("Hi\n")
using namespace std;
#define INF 0x3f3f3f3f
#define N 22
int a[N],b[N];
int dp[N][N][N][N];
int n;
int suma[N],sumb[N];
int dfs(int le,int ri,int lle,int rri)
{
if(dp[le][ri][lle][rri]!=-1) return dp[le][ri][lle][rri];
int i,j;
int temp=0;
if(le>ri&&lle>rri)
return dp[le][ri][lle][rri]=0;
temp+=suma[ri]-suma[le-1];
temp+=sumb[rri]-sumb[lle-1];
int ans=0;
if(le<=ri)
{
ans=max(ans,temp-dfs(le+1,ri,lle,rri));
ans=max(ans,temp-dfs(le,ri-1,lle,rri));
}
if(lle<=rri)
{
ans=max(ans,temp-dfs(le,ri,lle+1,rri));
ans=max(ans,temp-dfs(le,ri,lle,rri-1));
}
return dp[le][ri][lle][rri]=ans;
}
int main()
{
int i,j;
int t;
sf(t);
while(t--)
{
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
suma[i]=suma[i-1]+a[i];
}
for(i=1;i<=n;i++)
{
sf(b[i]);
sumb[i]=sumb[i-1]+b[i];
}
mem(dp,-1);
pf("%d\n",dfs(1,n,1,n));
}
return 0;
}
标签:dfs+记忆化
原文地址:http://blog.csdn.net/u014737310/article/details/45938615