• cf787c 博弈论+记忆化搜索


    好题,单纯的就是pn状态的推导

    /*
    把第一个点标为0,剩下的点按1-n-1编号 
    胜态是1,败态为0,dp[i][j]表示第i个人,怪兽起始位置在j时的胜负态
    把0点设置为必败态,然后对于一个人来说,所有能到0点的点都设为必胜态,然后对于另一个人来说,如果他所有选择都会走到对手的必胜态上,那么这个状态就是必败 
    */
    #include<bits/stdc++.h>
    using namespace std;
    #define maxn 10000
    
    vector<int>s[2];
    int n,a,t1,t2,dp[2][maxn],chose[2][maxn];
    
    void dfs(int k,int i,int v){
        if(dp[k][i]!=-1) return;//如果已经有状态
        dp[k][i]=v;
        if(v==0){
            for(int it : s[k^1]){//所有能到达i点的都是必胜态 
                int j=(i+n-it)%n;
                if(j==0) continue;
                dfs(k^1,j,1); 
                
            }
        }    
        else {
            for(int it : s[k^1]){
                int j=(i+n-it)%n;
                if(j==0) continue;
                if(--chose[k^1][j]==0)//如果这个点能到达的点都是必胜态,那么这个点就是必败态 
                    dfs(k^1,j,0); 
            }
        }
    }
    
    int main(){
        scanf("%d",&n);
        scanf("%d",&t1);
        s[0].clear();
        for(int i=0;i<t1;i++){
            scanf("%d",&a);
            s[0].push_back(a);
        }
        
        scanf("%d",&t2);
        s[1].clear();
        for(int i=0;i<t2;i++){
            scanf("%d",&a);
            s[1].push_back(a);
        }
        
        for(int i=1;i<n;i++) chose[0][i]=t1;
        for(int i=1;i<n;i++) chose[1][i]=t2;
        memset(dp,-1,sizeof dp);
        
        dfs(0,0,0);
        dfs(1,0,0);
        
        for(int i=1;i<n;i++) {
            if(dp[0][i]==-1) printf("Loop ");
            else if(dp[0][i]==1) printf("Win ");
            else printf("Lose ");
        }
        puts("");
        for(int i=1;i<n;i++){
            if(dp[1][i]==-1) printf("Loop ");
            else if(dp[1][i]==1) printf("Win ");
            else printf("Lose ");
        }
        puts("");
    } 
  • 相关阅读:
    光学镜头参数详解(EFL、TTL、BFL、FFL、FBL/FFL、FOV、F/NO、RI、MTF、TVLine、Flare/Ghost)
    三角函数公式
    技术工人的升华
    如何在apache启动的时候不输入ssl的密码
    汉字转拼音问题
    深入PHP内核(1) 引用
    如何把普通的exe服务器程序注册成windows 服务
    如何学习Yii
    横向同步问题
    多态的内幕(C++, C)语言两个版本
  • 原文地址:https://www.cnblogs.com/zsben991126/p/10205962.html
Copyright © 2020-2023  润新知