【第22期】观点:IT 行业加班,到底有没有价值?

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 举报

相关文章推荐

poj-3791-An Easy Game-记忆化搜索

dp[i][j]:还有i个不相同的位置,还能走j步,一共有多少种走法。 很明显 dp[i][j]=sigm(dp[i-k][j-1]*c[i][k]*c[n-i][m-k]); 用记忆化搜索记忆...

HDU 4753 Fishhead’s Little Game (记忆化搜索)

Fishhead’s Little Game <span style="font-family: Arial; font-size: 12px;

程序员升职加薪指南!还缺一个“证”!

CSDN出品,立即查看!

POJ 2599 A funny game(组合博弈 P/N态+记忆化搜索)

Description There are several airports in one country, and there are flights between some of them. ...

uva 10239 - The Book-shelver's Problem(记忆化搜索)

题目连接:uva 10239 - The Book-shelver's Problem <

28.uva 10891 Game of Sum 记忆化dp

这题和上次的通化邀请赛的那题一样,而且还是简化版本。。。 那题的题解 请戳这里 。。。 #include&lt;cstdio&gt; #include&lt;algorithm&gt; #include&lt;cstri
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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