1031 - Easy Game (记忆化搜索)

原创 2015年11月20日 23:13:11
                                                                                                                       1031 - Easy Game
PDF (English) Statistics Forum
Time Limit: 2 second(s) Memory Limit: 32 MB

You are playing a two player game. Initially there are ninteger numbers in an array and player A and B get chance to takethem alternatively. Each player can take one or more numbers from the left orright end of the array but cannot take from both ends at a time. He can take asmany consecutive numbers as he wants during his time. The game ends when allnumbers are taken from the array by the players. The point of each player iscalculated by the summation of the numbers, which he has taken. Each playertries to achieve more points from other. If both players play optimally andplayer A starts the game then how much more point can player Aget than player B?

Input

Input starts with an integer T (≤ 100),denoting the number of test cases.

Each case contains a blank line and an integer N (1≤ N ≤ 100) denoting the size of the array. The next linecontains N space separated integers. You may assume that no number willcontain more than 4 digits.

Output

For each test case, print the case number and the maximumdifference that the first player obtained after playing this game optimally.

Sample Input

2

4

4 -10 -20 7

4

1 2 3 4


Output for Sample Input

Case 1: 7

Case 2: 10

题意: 题目的大意是这样的,有两个人在玩游戏,游戏的场景是这样的.在一个n个数的数列里,每一轮游戏,游戏者都可以从左端或者右端取k>0个数,作为它的分数,游戏双方轮流来.问最后先手的分数比后手多了多少?(假设游戏双方都是绝顶聪明)


题解: 记忆化搜索. 首先我们可以把问题抽象化为子结构,以dp[v][i][j],表示当v这个人遇到数列中只剩下i~j个数时,他最大能最大化他的分数值为dp[v][i][j]; 所以最后的答案就是dp[先手][1][n],因为先手面临的状态是1~n; 有了这个子结构的话,状态转移方程就很容易写了.

AC代码:

/* ***********************************************
Author        :xdlove
Created Time  :2015年11月20日 星期五 22时22分21秒
File Name     :lightoj/1031/Easy_Game.cpp
 ************************************************ */

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <memory.h>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>

using namespace std;


#define REP_ab(i,a,b) for(int i = a; i <= b; i++)
#define REP(i, n) for(int i = 0; i < n; i++)
#define REP_1(i,n) for(int i = 1; i <= n; i++)
#define DEP(i,n) for(int i = n - 1; i >= 0; i--)
#define DEP_N(i,n) for(int i = n; i >= 1; i--)
#define CPY(A,B) memcpy(A,B,sizeof(B))
#define MEM(A) memset(A,0,sizeof(A))
#define MEM_1(A) memset(A,-1,sizeof(A))
#define MEM_INF(A) memset(A,0x3f,sizeof(A))
#define MEM_INFLL(A) memset(A,0x3f3f,sizeof(A))
#define mid (((l + r) >> 1))
#define lson l, mid, u << 1
#define rson mid + 1, r, u << 1 | 1
#define ls (u << 1)
#define rs (u << 1 | 1)


typedef long long ll;
typedef unsigned long long ull;
const int INF = 0x3f3f3f3f;
const ll INFLL = 0x3f3f3f3f3f3f3f3f;
const int MAXN = 1e5 + 5;
const int MAXM = MAXN;
const int mod = 1e9 + 7;
int dp[2][110][110],a[110],n;

int dfs(int v,int l,int r) {
    int &ans = dp[v][l][r],Max,tp;
    if(l > r) return 0;
    if(~ans) return ans;
    ans = 0;
    Max = -INF;
    for(int i = l; i <= r; i++) {
        ans += a[i];
        Max = max(Max,ans - dfs(v ^ 1,i + 1,r));
    }
    ans = 0;
    for(int i = r; i >= l; i--) {
        ans += a[i];
        Max = max(Max,ans - dfs(v ^ 1,l,i - 1));
    }
    return ans = Max;
}

int main() {
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    int T,cnt = 0;
    cin>>T;
    while(T--) {
        MEM_1(dp);
        scanf("%d",&n);
        REP_1(i,n) scanf("%d",&a[i]);
        printf("Case %d: %d\n",++cnt,dfs(0,1,n));
    }
    return 0;
}


版权声明:追逐心中的梦想,永不放弃! By-xdlove

HDU 4597 Play Game[博弈论 负值最大函数 记忆化搜索]

题干Problem Description Alice and Bob are playing a game. There are two piles of cards. There are N c...
  • micsay
  • micsay
  • 2016年07月20日 19:47
  • 123

(beginer) UVA 记忆化搜索 UVA 10536 - Game of Euler

Problem F Game of Euler Input: Standard Input Output: Standard Output Time Limit: 3 Seconds The...

ZOJ 3644 Kitty's Game(记忆化搜索+剪枝)

题意: n个点的有向图,每个点有一个数p[i],得到分数为所经过点的最小公倍数。初始为1,求走到n时为k的方案数。       思路比较清晰,一不小心就A了。       分析:从初始点开始记忆化...

HDU 4597 Play Game (记忆化搜索)无语的节奏

Play Game Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) Tota...
  • YJX_xx
  • YJX_xx
  • 2014年06月29日 16:42
  • 570

HDU 4597 Play Game(四维记忆化搜索)

做之前问虎哥比赛的时候怎么过掉的,虎哥说秒过。感觉自己好水啊。。。。 四维记忆化搜索。决策的条件是如果你剩下的数越小你得到的数越大。dp[l1][r1][l2][r2]代表当前状态的最优的情况。 ...

HDU 4597 Play Game (DP,记忆化搜索,博弈)

传送门:http://acm.hdu.edu.cn/showproblem.php?pid=4597 大致题意:给出2堆数,Alice和Bob轮流拿,每次只能从每堆数的头或尾取,Alice先...

【poj 1143】Number Game 博弈论+记忆化搜索

【poj 1143】Number Game 博弈论+记忆化搜索
  • pbihao
  • pbihao
  • 2016年08月20日 11:09
  • 107

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

题目大意: 有两个人玩取数的游戏,每次只能从两堆数列的两头取一个数,问先取的那个人最大能够获得的数是多少。 解题思路: 有题解说是记忆化搜索,很显然,我用了4维dp保存结果。dp[i][j][k][t...

HDU 1079 Calendar Game(简单博弈--记忆化搜索)

【题意】两个人玩游戏。游戏规则是,给定一个年份,你有两种操作:把当前的日期变成第二天,比如说1999.12.31那么第二天就是2000.1.1;或者把当前日期变成下一个月的同一天,比如1998.02....

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

题意: 给你两摞牌,每次可以任意一堆 的牌头或者牌尾抽牌。Alice先抽,Bob后抽,两个人都想抽到最多点数的牌。 做法: dp[az][ay][bz][by]。 az,ay代表第一堆牌左边 和右...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:1031 - Easy Game (记忆化搜索)
举报原因:
原因补充:

(最多只允许输入30个字)