HDU 4597 Play Game(记忆化)

Play Game

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)

Total Submission(s): 894    Accepted Submission(s): 525

Problem Description

Alice and Bob are playing a game. There are two piles of cards. There are N cards in each pile, and each card has a score. They take turns to pick up the top or bottom card from either pile, and the score of the card will be added
to his total score. Alice and Bob are both clever enough, and will pick up cards to get as many scores as possible. Do you know how many scores can Alice get if he picks up first?

Input

The first line contains an integer T (T≤100), indicating the number of cases.

Each case contains 3 lines. The first line is the N (N≤20). The second line contains N integer ai (1≤ai≤10000). The third line contains N integer bi (1≤bi≤10000).

Output

For each case, output an integer, indicating the most score Alice can get.

Sample Input

2 

1
23
53 

3
10 100 20
2 4 3 

Sample Output

53
105 

Source

2013 ACM-ICPC吉林通化全国邀请赛——题目重现

Recommend

liuyiding   |   We have carefully selected several similar problems for you:  5235 5234 5233 5232 5231

#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;
}
时间: 2024-10-12 16:59:45

HDU 4597 Play Game(记忆化)的相关文章

HDU 4597 Play Game(记忆化搜索,深搜)

题目 //传说中的记忆化搜索,好吧,就是用深搜//多做题吧,,这个解法是搜来的,蛮好理解的 //题目大意:给出两堆牌,只能从最上和最下取,然后两个人轮流取,都按照自己最优的策略,//问说第一个人对多的分值.//解题思路:记忆化搜索,状态出来就非常水,dp[fl][fr][sl][sr][flag],//表示第一堆牌上边取到fl,下面取到fr,同样sl,sr为第二堆牌,flag为第几个人在取.//如果是第一个人,dp既要尽量大,如果是第二个人,那么肯定尽量小. http://www.2cto.co

hdu 4597 Play Game(记忆化搜索)

题目链接:hdu 4597 Play Game 题目大意:给出两堆牌,仅仅能从最上和最下取,然后两个人轮流取,都依照自己最优的策略.问说第一个人对多的分值. 解题思路:记忆化搜索,状态出来就很水,dp[fl][fr][sl][sr][flag],表示第一堆牌上边取到fl,以下取到fr,相同sl.sr为第二堆牌,flag为第几个人在取.假设是第一个人,dp既要尽量大,假设是第二个人,那么肯定尽量小. #include <cstdio> #include <cstring> #incl

hdu 4597 Play Game (记忆化搜索 区间dp)

#include<cstdio> #include<cstring> #include<cmath> #include<iostream> #include<algorithm> using namespace std; int dp[30][30][30][30]; int vis[30][30][30][30]; int a[2][30],sum[2][30]; int dfs(int i,int j,int k,int l) { if(vi

hdu 2833 WuKong(最短路径+记忆化搜索)

http://acm.hdu.edu.cn/showproblem.php?pid=2833 大致题意:给定一个无向图,以及悟空和师傅起点与终点,求它们分别从起点到终点的最短路径中经过相同的点的最大个数. 思路:首先dijkstra求出最短路,那么如果有dis[a] + map[a][b] = dis[b],则边(a,b)一定在最短路径上.根据这一定理可以求出所有最短路径.然后类似于求最长公共子序列求经过的相同点的最大个数. 即若a==b ,dp[a][b] = max(dp[i][j]+1)

hdu 1142 最短路+记忆化

最短路+记忆化搜索 HDU 1142 A Walk Through the Forest 链接:http://acm.hdu.edu.cn/showproblem.php?pid=1142 题意:找出不同的路径条数,假如jimmy要从A走到B的话满足jimmy从B到家的距离比从A到家的距离短 这样我们可以通过最短路算法,找出从家(看成源点)到各个点的最短路径长度,记做D[v]. 然后就可以从起点(office) dfs,首先从某点i到某点j走得通,然后满足D[j] 1 #include<stdi

HDU - 1428【bfs+记忆化】

点击查看详情--<IJCAI 2017 口碑商家客流量预测大赛> 漫步校园 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4205    Accepted Submission(s): 1317 Problem Description LL最近沉迷于AC不能自拔,每天寝室.机房两点一线.由于长时间坐在电脑边,缺乏运动.他决定充分利用每

HDU 1428-漫步校园(记忆化搜索)

漫步校园 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3071    Accepted Submission(s): 932 Problem Description LL最近沉迷于AC不能自拔,每天寝室.机房两点一线.由于长时间坐在电脑边,缺乏运动.他决定充分利用每次从寝室到机房的时间,在校园里散散步.整个HDU校园呈方形布局,可划

HDU 3779 Railroad(记忆化搜索)

Railroad Time Limit : 4000/2000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submission(s) : 10   Accepted Submission(s) : 3 Font: Times New Roman | Verdana | Georgia Font Size: ← → Problem Description A train yard is a complex ser

hdu 5787 数位dp,记忆化搜索

题意:求区间[l,r]内有多少个数符合,这个数的任意的相邻k位数(digits),这k个数都两两不相等 l,r范围是1~1e18,k是2~5 思路:数位DP,因为K<=5,我们最多需要保存下来当前位的前4位就足够了.因为dp[pos][p1][p2][p3][p4]表示,现在枚举取第pos位,pos位之前的四位分别为p1,p2,p3,p4,p4是pos的上一位.那么p1~p4的范围就是0~9,但是因为总位数小于当前数字的位数的数也要进行枚举,需要一个数字来区分它是前导0还是在中间时为0,令p =

HDU 5115 Dire Wolf(记忆化搜索)

题目大意:有n只狼,每只狼有一个自己攻击的属性,还有一个属性就是可以给左边和右边的狼提高攻击力.这个左边的意思是如果离得最近的那个死了,攻击力加给离得左边没死的最近的一个. 思路:一开始以为贪心可解,但是显然想简单了啊.后来知道了是区间dp,dp[i][j]代表在区间i到j内的最小伤害数.关键是划分区间,我们让设k为区间内最后死的那匹狼,那么区间内就有状态转移公式:dp[i][j] = min(dp[i][j],    dp[i][k-1]+dp[k+1][j]+ num[k] + f[i-1]