您的位置:首页 > 其它

1031 - Easy Game (记忆化搜索)

2015-11-20 23:13 197 查看
                                                                                                                       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
题解: 记忆化搜索. 首先我们可以把问题抽象~最大能最大化他的分数值为dp[v][i]p[1n],因为先手面临的状态是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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  dp 搜索 博弈游戏