庞果网-单词博弈

原创 2013年12月02日 12:45:57
 
题目详情

甲乙两个人用一个英语单词玩游戏。两个人轮流进行,每个人每次从中删掉任意一个字母,如果剩余的字母序列是严格单调递增的(按字典序a < b < c <....<z),则这个人胜利。两个人都足够聪明,甲先开始,问他能赢么?

输入: 一连串英文小写字母,长度不超过15,保证最开始的状态不是一个严格单增的序列。

输出:1表示甲可以赢,0表示甲不能赢。

例如: 输入 bad, 则甲可以删掉b或者a,剩余的是ad或者bd,他就赢了,输出1。

又如: 输入 aaa, 则甲只能删掉1个a,乙删掉一个a,剩余1个a,乙获胜,输出0。

 

此题属于明显的博弈问题,但是比较遗憾的是在我的acm生涯中没接触过博弈论这个部分,因此刚开始尝试利用模拟的方法解决,利用极大极小搜索+alpha beta剪枝找到最优解,实现后提交结果超时了,继续优化后没有发现比较好的剪枝方法,因此不得不换个思路。

 

百度了下博弈论的基本概念,顿时茅塞顿开,解决这个问题,只需要知道两个基本概念即可!

1.一个局势只能是必胜局势或必败局势两种
2.如果一个局势能通过操作变为必败局势,那么这个局势就是必胜的,否则是必败的

 

此题即求初始的序列是否是必胜局势,不难发现此题的必败局势是升序序列,因为在到达这个局势时对手已经赢了,我们可以枚举当前局势的每种子局势,判断它是否是必胜还是必败,然后得到当前局势的状态。

 

static const int fastbit[32] = {
    0, 1, 28, 2, 29, 14, 24, 3, 30, 22, 20, 15, 25, 17, 4, 8,
    31, 27, 13, 23, 21, 19, 16, 7, 26, 12, 18, 6, 11, 5, 10, 9
};

#define FASTBIT(X) (fastbit[((unsigned int)(((X)&-(X))*0x077CB531U))>>27])

int state[(1<<16)-1]; //0代表必败,1代表必胜

int who(char *word)
{
    int len;
    int i ,j ,t ,k;
    len = strlen(word);
    
    memset(state, 0, sizeof(state));
    
    for(i = 1 ;i < (1<<len) ;i ++) {
        
        t = i;
        k = -1;
        while(t) {
            
            j = FASTBIT(t);
            if(k >= 0 && word[k] >= word[j]) { //判断是否升序
                break;
            }
            k = j;
            t &= ~(t&-t);
        }
        
        if(!t) {
            continue;
        }
        
        t = i;
        k = 0;
        while(t && !state[i]) { //枚举当前局势的子局势
            
            j = FASTBIT(t);
            state[i] = state[(t&~(1<<j))|k]^1;
            k = ((1<<(j+1))-1)&i;
            t &= ~(t&-t);
        }
        
    }
    
    return state[(1<<len)-1];
}


 

庞果网 —在线编程 —单词博弈 — 特殊解法

英雄会第一届在线编程大赛:单词博弈  15 奖 剩余时间:9天12小时4分37秒 编程语言:C C++ Java C# 答题时长:120 分钟│难度等级: ...

数组排序【庞果网、英雄会】

  • 2013年12月29日 20:17
  • 247KB
  • 下载

子序列的个数 --- 庞果网

庞果网的新题目: 题目描述 本题同样来自caopengcs,只要你有兴趣,每个人都可以出题(出题入口在主页右侧边栏“贡献题目”->“我要发布”内),以下是题目详情: 子序列的定义:对于一个序列a...
  • ygrx
  • ygrx
  • 2013年09月18日 15:39
  • 3837

均分01【庞果网 英雄会】

  • 2013年12月30日 12:50
  • 11KB
  • 下载

个人对数组排序(来自庞果网)的解法

自己做的数组排序问题,自己比较菜,以后还是要多多练习!请各位大神们多多指教,小弟感激不尽! 题目: 给定一个包含1-n的数列,我们通过交换任意两个元素给数列重新排序。求最少需要多少...

倒水问题---庞果网

还是庞果网,今天和他杠上了,倒水问题。 题目详情 有两个容器,容积分别为A升和B升,有无限多的水,现在需要C升水。 我们还有一个足够大的水缸,足够容纳C升水。起初它是...
  • ygrx
  • ygrx
  • 2013年07月24日 14:53
  • 3057

庞果网 合法字符串

庞果网 合法字符串 代码
  • jyy208
  • jyy208
  • 2013年08月01日 16:31
  • 1640

庞果网之建立信号基站

题目详情 要建立一个信号基站服务n个村庄,这n个村庄用平面上的n个点表示。假设基站建立的位置在(X,Y),则它对某个村庄(x,y)的距离为max{|X – x|, |Y – y|}, 其中| |表...

庞果网之素因子集合

【题目】 题目详情 小强最近在学初等数论,老师给他们出了一个课后习题,那就是给你两个正整数A,B(0 输入描述: 输入包含多组测试数据,每组测试数据包含两个正整数A...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:庞果网-单词博弈
举报原因:
原因补充:

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