• strGame:博弈论,trie


    挺有意思的一道题。初探博弈论。

    最好自己思考?

    我们先考虑只有1轮游戏的情况。

    这题明显要在字符串上一位一位地走,所以对字符串建立起trie。

    最终建立起的trie的叶节点就是必败位置了。

    对于非叶节点,如果它有一个儿子是必败节点,那么这个节点就是必胜节点了。(类似与mex函数)

    那么如果根节点必胜,那么就是先手必胜,否则就是后手必胜了。

    如果最后一轮后手必胜,那么两个人就需要争夺最后一轮的后手,所以他们要赢倒数第二轮。

    而倒数第二轮和最后一轮是一样的,那么倒数第二轮也是后手必胜。倒数第二轮的后手整场游戏也必胜。

    以此类推到倒数第三轮,倒数第四轮。。。直到第一轮,都一样。

    所以,如果某一轮中后手必胜,那么整场游戏后手Dirty必胜。

    剩下的情况就是先手必胜,那么就是要争夺先手,那么就要尽量输掉倒数第二轮。

    如何判定先手能否必定让自己输掉一轮游戏?

    只要把trie树的叶节点改为必胜节点就好了,再跑一遍。

    那么如果先手可以必定让自己输掉一轮游戏,也能必定让自己赢一轮游戏。

    那么除了最后一轮以外他都可以让自己输掉以取得先手,直到最后一轮让自己取胜。

    所以,如果某一轮中先手必胜,先手在相反游戏中也必胜(即可以让自己必定输掉),那么整场游戏先手Pure必胜。

    剩下的就是先手在一轮游戏中必胜,但是不能在相反游戏中取胜(即自己不能必定输掉)。

    最后一轮是先手必胜。

    倒数第二轮中要争夺最后一轮的先手,故要输掉,所以倒数第二轮中的后手在整场游戏中必胜。

    倒数第三轮中要争夺倒数第二轮的后手,要赢,所以倒数第三轮的先手在整场游戏中必胜。

    以此类推。。。

    所以,如果一轮游戏先手必胜,而相反游戏后手必胜(即先手不能让自己输掉),总轮数为奇数时,先手Pure必胜。否则,后手Dirty必胜。

    好题。

    自己思考酣畅淋漓(数学自习灵感++)

     1 #include<cstdio>
     2 #include<cstring>
     3 using namespace std;
     4 int k,trie[100005][27],w[2][100005],cnt,n,rt,len;char s[100005];
     5 void insert(int &p,int al){
     6     if(!p)p=++cnt;if(al==len)return;
     7     insert(trie[p][s[al]-'a'],al+1);
     8 }
     9 void dfs(int p){
    10     int hs=0;w[0][p]=w[1][p]=0;
    11     for(int i=0;i<=25;++i)if(trie[p][i]){hs=1;break;}
    12     if(!hs){w[0][p]=1;w[1][p]=0;return;}
    13     for(int i=0;i<=25;++i)if(trie[p][i]){
    14         dfs(trie[p][i]);
    15         if(!w[0][trie[p][i]])w[0][p]=1;
    16         if(!w[1][trie[p][i]])w[1][p]=1;
    17     }
    18 }
    19 int main(){
    20     int t;scanf("%d",&t);
    21     while(t--){
    22         scanf("%d%d",&n,&k);rt=cnt=0;memset(trie,0,sizeof trie);
    23         for(int i=1;i<=n;++i)scanf("%s",s),len=strlen(s),insert(rt,0);
    24         dfs(rt);//for(int i=1;i<=cnt;++i)printf("%d %d
    ",w[0][i],w[1][i]);
    25         if(!w[1][rt])puts("Dirty");
    26         else if(w[0][rt])puts("Pure");
    27         else if(k&1)puts("Pure");
    28         else puts("Dirty");
    29     }
    30 }
    View Code
  • 相关阅读:
    【SAS NOTE】OUTPUT
    【SAS NOTES】_NULL_
    【SAS NOTE】sas 9.2 安装
    【SAS NOTE】FREQ
    纯数学教程 Page 203 例XLI (1)
    纯数学教程 Page 203 例XLI (3)
    纯数学教程 Page 203 例XLI (2)
    Prove Cauchy's inequality by induction
    纯数学教程 Page 325 例LXVIII (15) 调和级数发散
    纯数学教程 Page 325 例LXVIII (15) 调和级数发散
  • 原文地址:https://www.cnblogs.com/hzoi-DeepinC/p/11564050.html
Copyright © 2020-2023  润新知