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

[LUOGU] P2593 [ZJOI2006]超级麻将的更多相关文章

  1. 洛谷 P2593 [ZJOI2006]超级麻将【dp】

    设f[i][j][k][0/1]表示选到i时,i-1选j张,i选k张,之前选的所有牌是否选择了对子 然后分情况讨论转移即可 #include<iostream> #include<c ...

  2. LUOGU 2593 : [Zjoi2006] 超级麻将

    传送门 解题思路 直接爆搜全T..状态数太多了,所以我们考虑贪心+剪枝.贪心:先拿三个连着的,再拿四个一样的,再拿三个一样的,最后拿两个一样的这样的搜索顺序最优,两个的放最后是因为只要这样的一个,三个 ...

  3. [ZJOI2006]超级麻将

    题目描述 很多人都知道玩麻将,当然也有人不知道,呵呵,不要紧,我在这里简要地介绍一下麻将规则: 普通麻将有砣.索.万三种类型的牌,每种牌有1~9个数字,其中相同的牌每个有四张,例如1砣~9砣,1索~9 ...

  4. [ZJOI2006]超级麻将(可行性dp)

    题目描述 要判断某人是否胡牌,显然一个弱智的算法就行了,某中学信息学小组超级麻将迷想了想,决定将普通麻将改造成超级麻将. 所谓超级麻将没有了砣.索.万的区分,每种牌上的数字可以是1~100,而每种数字 ...

  5. [ZJOI2006]超级麻将(动规)

    题目描述 很多人都知道玩麻将,当然也有人不知道,呵呵,不要紧,我在这里简要地介绍一下麻将规则: 普通麻将有砣.索.万三种类型的牌,每种牌有1~9个数字,其中相同的牌每个有四张,例如1砣~9砣,1索~9 ...

  6. [bzoj1860 ZJOI2006] 超级麻将 (线性dp)

    传送门 Description Input 第一行一个整数N(N<=100),表示玩了N次超级麻将. 接下来N行,每行100个数a1..a100,描述每次玩牌手中各种牌的数量.ai表示数字为i的 ...

  7. [Luogu2593] [ZJOI2006]超级麻将

    题目地址 :https://www.luogu.org/problemnew/show/P2593. 无脑DP(虽说是抄的额) #include <iostream> #include & ...

  8. 洛谷2593 [ZJOI2006]超级麻将——可行性dp

    题目:https://www.luogu.org/problemnew/show/P2593 发现三个连续牌的影响范围只有3.相同牌的影响范围只有1之后就可以dp了. O(100^7)T飞. #inc ...

  9. bzoj 1860: [Zjoi2006]Mahjong麻将 题解

    [原题] 1860: [Zjoi2006]Mahjong麻将 Time Limit: 1 Sec  Memory Limit: 64 MB Submit: 211  Solved: 122 [Subm ...

随机推荐

  1. Source Insight 入门设置

    在添加工程时,如果想添加文件夹下所有的文件,应该选择 “add tree” Source Insight 类名显示乱码解决 最近重新安装里source insight,但是打开文件后,类名显示乱码? ...

  2. 快速删除node_modules文件夹

    前言 当安装了较多模块后,node_modules目录下的文件会很多,直接删除整个目录会很慢,下面介绍些快速删除node_modules目录的方法. 方法一:使用rimraf模块的命令 在全局安装ri ...

  3. Java | 基础归纳 | 随机数应用

    Java中一般有两种随机数,一个是Math中random()方法,一个是Random类. Math.random();//返回0~1的中随机数值 Random random = new Random( ...

  4. celery (分布式系统)

    celery 介绍 Celery - 分布式任务队列. Celery 是一个简单.灵活且可靠的,处理大量消息的分布式系统,并且提供维护这样一个系统的必需工具. ​ 它是一个专注于实时处理的任务队列,同 ...

  5. python之 __getattr__、__getattr__、__getitem__、__setitem__ 使用

    python之 __getattr__.__getattr__.__getitem__.__setitem__ 使用 __getattr__内置使用点号获取实例属性属性如 s.name,自调用__ge ...

  6. DB2 函数

    1.大小写转换 转大写UPPER 转小写LOWER

  7. [在读]JavaScript异步编程:设计快速响应的网络应用

    很棒的一本,就如书名所示,主要讲js异步的一些东西,比如定时器.Jquery的promise和deffered,node...看了一小半.推荐哦~~

  8. On the way to the park Gym - 101147I 几何

    http://codeforces.com/gym/101147/problem/I I. On the way to the park time limit per test 5 seconds m ...

  9. java中 awt Graphics2D

    Graphics2D ,Graphics 类,提供了对几何形状.坐标转换.颜色管理和文本布局更为复杂的控制.它是用于在 Java(tm) 平台上呈现二维形状.文本和图像的基础类.验证码生成可以用到此类 ...

  10. IT兄弟连 JavaWeb教程 Servlet定义以及环境配置 BS程序和CS程序

    随着网络技术的不断发展,单机的软件程序已难以满足网络计算机的需求.为此,各种各样的网络程序开发体系结构应运而生.其中,运用最多的网络应用程序开发体系结构可以分为两种,一种是基于客户端/服务器的C/S结 ...