链接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数组储存胜负状态(记忆化搜索,博弈)

最新文章

  1. Eclipse 关联项目的源码
  2. 剑指Offer 反转链表
  3. Spring学习8-Spring事务管理(注解式声明事务管理)
  4. Fragments碎片
  5. ping命令的用法大全!
  6. Publisher/Subscriber 订阅-发布模式
  7. spring与mybatis集成和事务控制
  8. 为什么我最终替换掉了NATS
  9. &lt;jsp:include&gt;和&lt;%@include%&gt;的区别
  10. scrapy_xpath
  11. 面试必问Elasticsearch倒排索引原理
  12. [NewLife.XCode]脏数据
  13. 强化学习(一)—— 基本概念及马尔科夫决策过程(MDP)
  14. HDOJ 3308 LCIS (线段树)
  15. 服务调用restful或feign负载均衡ribbon
  16. python 网络内容: 初识socket
  17. ECONOMETRICS CHAPTER3
  18. TortoiseGit使用笔记
  19. 一篇文章入门Jmeter性能测试【经典长文】
  20. 如何虚拟机里安装win7操作系统

热门文章

  1. css3动画:执行前不显示,执行后显示
  2. [剑指Offer]47-礼物的最大价值(DP)
  3. Couchbase学习和使用
  4. Dom,pull,Sax解析XML
  5. Vue 插件和Preset
  6. Linux移植之内核启动过程start_kernel函数简析
  7. Java开发MIS系统需要的技术及其作用
  8. 13.Mysql触发器
  9. 探索未知种族之osg类生物---呼吸分解之事件循环二
  10. 错误:在非结构或联合中请求成员‘next’