关闭

HDU 4111 Alice and Bob

标签: 博弈
75人阅读 评论(0) 收藏 举报
分类:

题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=4111


题意:有n堆石子,每堆有ai个,现在可以选择一堆拿走一个,或者合并两堆。问谁能赢。


思路:

如果全部的堆数都大于1,那么一定是把石子全部合并后一个个取走,因为输的人没法一次取走一堆,而赢的人每次把最少的合并起来。

dp[i][j]表示有i堆为1的石子,j是所有大于1堆的石子的总操作数 j = ∑ai + m - 1  m为大于1堆石子的堆数,表示这m堆石子一共可以操作这么多次。

那么考虑所有的操作:

1、对大于1的堆进行(拿走/或者合并两个大于1的堆)=>  dp[i][j-1]

2、拿走一个“1”堆 => dp[i-1][j]

3、合并两个"1"堆 =>dp[i-2][2] / dp[i-2][j+3]  ( j = 0 / j != 0 )

4、把一个"1"堆合并到一个大于1的堆里 => dp[i-1][j+1]

记忆化搜索即可。


#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <stack>
#include <map>
#include <set>
#include <vector>
#include <sstream>
#include <queue>
#include <utility>
using namespace std;

#define rep(i,j,k) for (int i=j;i<=k;i++)
#define Rrep(i,j,k) for (int i=j;i>=k;i--)

#define Clean(x,y) memset(x,y,sizeof(x))
#define LL long long
#define ULL unsigned long long
#define inf 0x7fffffff
#define mod 100000007

int f[55][55555];
int n;
int ans;

int dfs( int x , int y )
{
    if ( f[x][y] != -1 ) return f[x][y];
    int ans = 0;
    if ( y == 1 ) return f[x][y] = dfs( x + 1 , 0 );
    if ( x == 0 ) return y & 1;
    if ( y > 1 ) //非1堆中进行操作
        ans = max( ans , 1-dfs( x , y - 1 ) );
    if ( x >= 1 ) //取走1
        ans = max( ans , 1-dfs( x - 1 , y ) );
    if ( x >= 2 ) //合并两堆"1"
        ans = max( ans , y==0?!dfs( x - 2 , 2 ) : 1-dfs( x - 2 , y + 3 ) );
    if ( x >= 1 && y > 1 ) //合并“1”和非1
        ans = max( ans , 1-dfs( x - 1 , y + 1 ) );
    return f[x][y] = ans;
}

void init()
{
    scanf("%d",&n);
    int temp,sum,num;
    num = sum = 0;
    rep(i,1,n)
    {
        scanf("%d",&temp);
        if ( temp == 1 ) num++;
        else sum += temp;
    }

    ans = dfs( num , sum + n - num - 1 );
}

int main()
{
    Clean(f,-1);
    f[0][0] = 0;
    int T;
    cin>>T;
    rep(kase,1,T)
    {
        init();
        printf("Case #%d: %s\n",kase,ans?"Alice":"Bob");
    }
    return 0;
}






0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:33333次
    • 积分:2780
    • 等级:
    • 排名:第13318名
    • 原创:254篇
    • 转载:1篇
    • 译文:0篇
    • 评论:36条
    最新评论