Description

Input

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

Output

输出N行,若胡了则输出Yes,否则输出No,注意区分Yes,No的大小写!

Sample Input

3
2 4 0 0 0 0 0 …… 0(一共98个0)
2 4 2 0 0 0 0 …… 0(一共97个0)
2 3 2 0 0 0 0 …… 0(一共97个0)

Sample Output

Yes
Yes
No

题解

这道题题解很多都是用贪心+$Hash$搜索做的,其实$DP$也可以解决这道题。

我们考虑选取麻将的先后是不互相影响的。且怎么选当前牌只会影响其相邻的几张牌,我们将这些影响的状态放入方程中,保证无后效性。

令: $f[i][j][k][0/1]$ 表示“择第 $i$ 号牌时,第 $i-1$ 号牌要打出 $j$ 张,第 $i$ 号牌要打出 $k$ 张,之前选的所有牌是否( $0/1$ )选择了将(对子)”是否可行。

于是就有转移方程:

  1. 考虑选这i号牌做将(对子):

    if (k>) f[i][j][k][]|=f[i][j][k-][];
  2. 考虑i号牌碰(三张相同):
    if (k>) f[i][j][k][]|=f[i][j][k-][],f[i][j][k][]|=f[i][j][k-][];
  3. 考虑i号牌杠(四张相同):
    if (k>) f[i][j][k][]|=f[i][j][k-][],f[i][j][k][]|=f[i][j][k-][];
  4. 考虑i-2,i-1,i三张牌吃(三个连续数字):
    if (j>=k&&a[i-]>=k) f[i][j][k][]|=f[i-][a[i-]-k][j-k][],f[i][j][k][]|=f[i-][a[i-]-k][j-k][];

最后结果为$f[100][a[99]][a[100]][1]$。

附的代码有个玄学的写法:当$i==1$时,$a[i-2]$越界?我也不知道它访问到哪去了,但$AC$了就苟活着吧。

人生处处是惊喜...难道不是吗?

 #include<set>
#include<map>
#include<ctime>
#include<cmath>
#include<queue>
#include<stack>
#include<cstdio>
#include<string>
#include<vector>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define LL long long
#define RE register
#define IL inline
using namespace std; int n,a[];
bool f[][][][]; int main()
{
scanf("%d",&n);
while (n--)
{
memset(f,,sizeof(f));
for (RE int i=;i<=;i++) scanf("%d",&a[i]);
f[][][][]=;
for (RE int i=;i<=;i++)
for (RE int j=;j<=a[i-];j++)
for (RE int k=;k<=a[i];k++)
{
if (k>) f[i][j][k][]|=f[i][j][k-][];
if (k>) f[i][j][k][]|=f[i][j][k-][],f[i][j][k][]|=f[i][j][k-][];
if (k>) f[i][j][k][]|=f[i][j][k-][],f[i][j][k][]|=f[i][j][k-][];
if (j>=k&&a[i-]>=k) f[i][j][k][]|=f[i-][a[i-]-k][j-k][],f[i][j][k][]|=f[i-][a[i-]-k][j-k][];
}
printf(f[][a[]][a[]][] ? "Yes\n":"No\n");
}
return ;
}

[ZJOI 2006]超级麻将的更多相关文章

  1. 洛谷P2593 [ ZJOI 2006 ] 超级麻将 —— DP

    题目:https://www.luogu.org/problemnew/show/P2593 DP的话,考虑到当前这一位只跟前两位有关,所以记录一下这3位的状态就行: 于是一开始记录的第 i 位,i- ...

  2. [ZJOI2006]超级麻将

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

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

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

  4. codevs2464超级麻将

    题目链接http://codevs.cn/problem/2464/ 题目描述 Description 很多人都知道玩麻将,当然也有人不知道,呵呵,不要紧,我在这里简要地介绍一下麻将规则: 普通麻将有 ...

  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. BZOJ 2006 超级钢琴(划分树+优先队列)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2006 题意: 给出一个数列A,L,R,构造出一个新的集合,集合中的数字为A中任意连续t( ...

  8. [BZOJ 2006] 超级钢琴

    Link: https://www.lydsy.com/JudgeOnline/problem.php?id=2006 Algorithm: 对于此类区间最值类问题,我们可以通过控制一端不变来寻找当前 ...

  9. bzoj 2006 超级钢琴 —— ST表

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2006 本来应该是可以用主席树,找区间最小值,取出来后再找那段区间的次小值...... 但也可 ...

随机推荐

  1. 根据IO流源码深入理解装饰设计模式使用

    一:摘要 通过对java的IO类中我们可以得出:IO源码中使用装饰设计模式频率非常高, 对装饰设计模式而言,他能够避免继承体系的臃肿,同时也可以动态的给一个对象添加一些额外的功能,如果要扩展一个功能, ...

  2. string和c_str()使用时的坑

    先看一段代码和它的运行结果: 看到结果了么这个运行的结果和我们理解的是不会有差距.对于经验丰富的开发者可能会微微一笑,但是对于一个刚刚学习的人就开始疑惑了.这里主要说两个问题: 1.声明了一个stri ...

  3. 听翁恺老师mooc笔记(7)--字符串1

    C语言中字符串的定义 如果定义一个字符数组word,并使用大括号对其初始化,如下图所示: 但是这个不是C语言的字符串,只是字符数组,不是字符串,因为不能使用字符串的方式进行计算.那么C语言的字符串长什 ...

  4. Linux中Eclipse下搭建Web开发环境

    0. 准备工作 java环境,Linux下基本上都有含开源jdk的库,可直接下载,且不用配置环境变量,当然也可以官网下载后自己配置: Eclipse Neon,注意看清是64位还是32位,下载的应该是 ...

  5. WebApi 方法的参数类型总结。

    1:[HttpGet]  ①:get方法之无参数. [HttpGet] public IHttpActionResult GetStudentInfor() { List<StudentMode ...

  6. 04_Linux目录文件操作命令1(mv ls cd...)_我的Linux之路

    上一节已经给大家讲了Linux的目录结构,相信大家已经对Linux的整个目录结构有所了解 现实中,服务器(包含Linux,Unix,windows server)一般都摆放在机房里,因为一个机房摆放了 ...

  7. Mysql必须知道的知识

    最近在准备面试,所以也整理了一些Mysql数据库常用的知识,供大家参考. 1.MySQL的复制原理以及流程 (1).复制基本原理流程 1. 主:binlog线程--记录下所有改变了数据库数据的语句,放 ...

  8. mingw打dll ,lib包命令和调用

    1,下面的命令行将这个代码编译成 dll. gcc mydll.c -shared -o mydll.dll -Wl,--out-implib,mydll.lib 其中 -shared 告诉gcc d ...

  9. SpringCloud的Hystrix(五) Hystrix机制

    参考链接:http://www.jianshu.com/p/e07661b9bae8 一.前言 大型复杂的分布式系统中,高可用相关的技术架构非常重要.高可用架构非常重要的一个环节,就是如何将分布式系统 ...

  10. zuul入门(5)zuul 处理异常

    Object accessToken = request.getParameter("accessToken"); if(accessToken==null) { // 设置zuu ...