zoukankan      html  css  js  c++  java
  • ACM-ICPC 2018 徐州赛区网络预赛 B BE, GE or NE(博弈,记忆化搜索)

    链接https://nanti.jisuanke.com/t/31454

    思路

    • 开始没读懂题,也没注意看数据范围(1000*200的状态,记忆化搜索随便搞)
    • 用记忆化搜索处理出来每个状态的胜负情况
    • 因为每个人都会选择最优的,因此记忆化搜索的过程其实就是在模拟两个人每一步决策所带来的胜负情况,
      只要返回一个必胜,就直接返回(因为会选择最优)
      然后在没有返回必胜的状态下,有平局就选择平局,没有平局就只能输了
    #include<bits/stdc++.h>
    #define st 100
    #define M 1005
    using namespace std;
    int f[M][500],n,m,l,r,a[M],b[M],c[M],ret,i;
    int dfs(int d,int p){
       if(d==n){
          if(p<=l)return 4;else if(p>=r)return 1;else return 2;
       }
       int &ans=f[d][p+st];
       if(ans!=-1)return ans;
       int win,los,ok=0,tp;
       if(d&1){win=4;los=1;}else{win=1;los=4;}
       if(a[d]){
          tp=dfs(d+1,min(100,p+a[d]));
          if(tp==win)return ans=win;
          if(tp==2) ok=1;
       }
       if(b[d]){
          tp=dfs(d+1,max(-100,p-b[d]));
          if(tp==win)return ans=win;
          if(tp==2)ok=1;
       }
       if(c[d]){
          tp=dfs(d+1,-p);
          if(tp==win)return ans=win;
          if(tp==2)ok=1;
       }
       if(ok)return ans=2;
       return ans=los;
    }
    int main(){
       memset(f,-1,sizeof(f));
       scanf("%d%d%d%d",&n,&m,&r,&l);
       for(i=0;i<n;i++)scanf("%d%d%d",&a[i],&b[i],&c[i]);
       ret=dfs(0,m);
       if(ret==1)cout<<"Good Ending"<<endl;
       else if(ret==4)cout<<"Bad Ending"<<endl;
       else cout<<"Normal Ending"<<endl;
    }
    

    知识点

    • dp数组储存胜负状态(记忆化搜索,博弈)
  • 相关阅读:
    INS-30011 输入的ADMIN口令不符合Oracle建议的标准
    INS-30001 ADMIN口令为空
    INS-20802
    ORA-00922:选项缺失或无效
    struts2的配置文件
    Cache Fusion
    MQ配置模板
    RTSP流媒体数据传输的两种方式(TCP和UDP)
    ArcGIS For Flex报错二
    ArcGIS For Flex报错
  • 原文地址:https://www.cnblogs.com/VIrtu0s0/p/9623614.html
Copyright © 2011-2022 走看看