博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[LUOGU] P2593 [ZJOI2006]超级麻将
阅读量:6583 次
发布时间:2019-06-24

本文共 1562 字,大约阅读时间需要 5 分钟。

 

f[a][b][c][i]表示考虑到第i个,第i位用了b个,第i-1位用了a个,此时有将/无将(c=1/0)的情况是否可达。

转移分以下几类:

1.调一个将 f[a][b][1][i]|=f[a][b-2][0][i];

2.碰 f[a][b][0/1][i]|=f[a][b-3][0/i][i];

3.杠 f[a][b][0/1][i]|=f[a][b-4][0/1][i];

4.顺 f[a][b][0/1][i]|=f[val[i-2]-b][a-b][0/1][i-1],其中b打完

注意到每个状态只与之前一行有关,可以滚动数组。

#include
#include
#include
#define CR ((i)&1)#define PR (((i)-1)&1)using namespace std;inline int rd() { int ret=0,f=1; char c; while(c=getchar(),!isdigit(c))f=c=='-'?-1:1; while(isdigit(c))ret=ret*10+c-'0',c=getchar(); return ret*f;}const int MAXN=128,N=100;int f[MAXN][MAXN][2][2];int val[MAXN];void init() { memset(f,0,sizeof(f));}void solve() { init(); f[0][0][0][0]=1; for(int i=1; i<=N; i++) val[i]=rd(); for(int i=1; i<=N; i++) { for(int a=0; a<=val[i-1]; a++) { for(int b=0; b<=val[i]; b++) { f[a][b][0][CR]=f[a][b][1][CR]=0; if(b>=2) f[a][b][1][CR]|=f[a][b-2][0][CR]; if(b>=3) f[a][b][1][CR]|=f[a][b-3][1][CR],f[a][b][0][CR]|=f[a][b-3][0][CR]; if(b>=4) f[a][b][1][CR]|=f[a][b-4][1][CR],f[a][b][0][CR]|=f[a][b-4][0][CR]; if(b<=a&&b<=(i<2?0:val[i-2])) f[a][b][0][CR]|=f[val[i-2]-b][a-b][0][PR], f[a][b][1][CR]|=f[val[i-2]-b][a-b][1][PR]; } } } if(f[val[99]][val[100]][1][0]) puts("Yes"); else puts("No");}int main() { int T; T=rd(); while(T--) solve(); return 0;}

 

转载于:https://www.cnblogs.com/ghostcai/p/9372102.html

你可能感兴趣的文章
IO 多路服用模型
查看>>
硬盘的读写原理
查看>>
STP-生成树协议-在交换网络中,存在备份链路的情况,防止2层数据转发环路的发生。...
查看>>
Java 核心内容相关面试题【4】
查看>>
部署自动化运维服务——Ansible
查看>>
SnapKit使用
查看>>
使用Windows 10的附近共享共享文件
查看>>
性能监控(3)&ndash;linux下的iostat命令
查看>>
铸件成型工艺设计
查看>>
[linux]【常用命令】
查看>>
2018年视频云服务市场格局进入整合阶段,阿里云视频云位居市场竞争力领导者的位置...
查看>>
红米Note 4怎么样刷入开发版启用Root权限
查看>>
centOS 7磁盘管理
查看>>
面试官:看你简历写了熟悉Kafka,它为什么速度会这么快?
查看>>
循环语句脚本
查看>>
SMTP错误码/建议解决方法
查看>>
bluestore设计的特点--2019_6
查看>>
我的友情链接
查看>>
linux中设置静态ip
查看>>
Android学习——HorizontalScollview水平滚动控件
查看>>