ACM-ICPC 2018 徐州赛区网络预赛 B BE, GE or NE(博弈,记忆化搜索)

Posted virtu0s0

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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数组储存胜负状态(记忆化搜索,博弈)


以上是关于ACM-ICPC 2018 徐州赛区网络预赛 B BE, GE or NE(博弈,记忆化搜索)的主要内容,如果未能解决你的问题,请参考以下文章

ACM-ICPC 2018 徐州赛区网络预赛 J. Maze Designer (最大生成树+LCA求节点距离)

ACM-ICPC 2018 徐州赛区网络预赛

ACM-ICPC 2018 徐州赛区网络预赛 B BE, GE or NE(记忆化搜索)

ACM-ICPC 2018 徐州赛区网络预赛 B BE, GE or NE(博弈,记忆化搜索)

ACM-ICPC 2018 徐州赛区网络预赛 D. EasyMath

ACM-ICPC 2018 徐州赛区网络预赛(9.9)