Codeforces Round #260 (Div. 1) B. A Lot of Games Trie + 博弈

题意:两个人在Trie树上博弈k局,当前局输的人在下一局中执先手。在一局博弈中,当一个人不能走时,判定另一个人赢。最后一局的结果作为整个游戏的结果。

分析:先手赢的情况为:(1)先手可必胜,也 可败。那么前k-1局败,最后一局胜利即可。

(2)先手只能必胜。 当k为奇数时获胜。

   后手赢的情况为:(1)先手必败。

(2)先手只能必胜。 k为偶数。


(本题的状态为取完当前节点的状况)

判定先手是否可必胜:叶子节点为可必胜。如果一个节点的后继存在必胜,那么此节点为必败。如果一个节点的后继全为必败,那么此节点为必胜。


那么判定是否可败也是这样类似:叶子节点为不可败。如果一个节点的后继存在可败,那么此节点为不可败。如果一个节点的后继全为不可败,那么此节点为可败。

代码:

#include
#include
#include
#include
#include
using namespace std;
const int maxn = 1e5+10;
const int ALP=26;
struct Trie{
    int next[maxn][ALP],dp[maxn],dp2[maxn];
    int root,p;
    int newnode(){
        for(int i=0;i0 && win>0) return dp[x] = 0;
        else return dp[x] = 1;
    }
    int dfs2(int x){
        int co=0, fail = 0;
        for(int i=0;i0 && fail==0) return dp2[x] = 1;
        else return dp2[x] = 0;
    }
    void solve(int k){
        int ok1=0 , ok2=0;
        dfs(root);
        for(int i=0;i


你可能感兴趣的:(codeforces,&,bestcoder,DP)