# 1031 - Easy Game (记忆化搜索)

1031 - Easy Game
 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.

2

4

4 -10 -20 7

4

1 2 3 4

# Output for Sample Input

Case 1: 7

Case 2: 10

AC代码:

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

#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;
}


• 本文已收录于以下专栏：

## （beginer） UVA 记忆化搜索 UVA 10536 - Game of Euler

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

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

Play Game Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) Tota...

## HDU 4597 Play Game 记忆化搜索

HDU 4597 Play Game  题目链接

## 【杭电2015年12月校赛G】【map记录 状压DP 记忆化搜索实现 】Pick Game nm棋盘两人轮流取数 所取位置周围至少2个为空 为先手最大取得权值

Pick Game Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tot...

举报原因： 您举报文章：深度学习：神经网络中的前向传播和反向传播算法推导 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)