[ZJOI2006]超级麻将(动规)
题目描述
很多人都知道玩麻将,当然也有人不知道,呵呵,不要紧,我在这里简要地介绍一下麻将规则:
普通麻将有砣、索、万三种类型的牌,每种牌有1~9个数字,其中相同的牌每个有四张,例如1砣~9砣,1索~9索,1万~9万各有4张,所以共36*3=108张牌。胡牌时每人有14张牌,其中只要某人手里有若干句话(就是同种类型的牌连续三张或同种牌三张),另外再加上一对,即可胡牌。当然如果全是对,叫七小对,也可以胡牌。下图是连三张示例。

要判断某人是否胡牌,显然一个弱智的算法就行了,某中学信息学小组超级麻将迷想了想,决定将普通麻将改造成超级麻将。
所谓超级麻将没有了砣、索、万的区分,每种牌上的数字可以是1~100,而每种数字的牌各有100张。另外特别自由的是,玩牌的人手里想拿多少张牌都可以,好刺激哦!
刺激归刺激,但是拿多了怎么胡牌呢?
超级麻将规定只要一个人手里拿的牌是若干句话(三个连续数字的牌各一张组成一句话,三张或者四张同样数字的牌也算一句话),再加上一对相同的牌,就算胡了。
作为信息学竞赛选手的你,麻烦你给这位超级麻将迷编个程序,判断能否胡牌。
输入输出格式
输入格式:
输入文件第一行一个整数N(N<=100),表示玩了N次超级麻将。
接下来N行,每行100个数a1..a100,描述每次玩牌手中各种牌的数量。ai表示数字为i的牌有ai张。(0<=ai<=100)
输出格式:
输出N行,若胡了则输出Yes,否则输出No,注意区分Yes,No的大小写!
思路:
HXY大神据说0msA题,Orz
这道题我用了一种相当暴力的DP,卡过去了。。。
我们开一个DP数组:dp[i][j][k][0/1]
第一维表示在哪个位置,第二维表示前一个位置麻将还剩下几张,第三维表示现在位置还剩下几张,第四位表示当前是否走过对子
dp数组的值表示这种情况能不能到达
我们枚举位置,前一位要用掉多少,这一位要用掉多少,有没有用过对子
转移即可
代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#define rii register int i
#define rij register int j
#define rik register int k
#define rit register int t
using namespace std;
int n,x[],dp[][][][];
int main()
{
// freopen("1.in","r",stdin);
scanf("%d",&n);
for(rit=;t<=n;t++)
{
memset(dp,,sizeof(dp));
for(rii=;i<=;i++)
{
scanf("%d",&x[i]);
}
dp[][][][]=;
for(rii=;i<=;i++)
{
for(rij=;j<=x[i-];j++)
{
for(rik=;k<=x[i];k++)
{
if(k>)
{
dp[i][j][k][]|=dp[i][j][k-][];
}
if(k>)
{
dp[i][j][k][]|=dp[i][j][k-][];
dp[i][j][k][]|=dp[i][j][k-][];
}
if(k>)
{
dp[i][j][k][]|=dp[i][j][k-][];
dp[i][j][k][]|=dp[i][j][k-][];
}
if(i-<&&k==&&j>k)
{
dp[i][j][k][]|=dp[i-][][j-k][];
dp[i][j][k][]|=dp[i-][][j-k][];
}
if(j>=k&&x[i-]>=k)
{
dp[i][j][k][]|=dp[i-][x[i-]-k][j-k][];
dp[i][j][k][]|=dp[i-][x[i-]-k][j-k][];
}
}
}
}
if(dp[][x[]][x[]][]==)
{
cout<<"Yes"<<endl;
}
else
{
cout<<"No"<<endl;
}
}
}
[ZJOI2006]超级麻将(动规)的更多相关文章
- [ZJOI2006]超级麻将
题目描述 很多人都知道玩麻将,当然也有人不知道,呵呵,不要紧,我在这里简要地介绍一下麻将规则: 普通麻将有砣.索.万三种类型的牌,每种牌有1~9个数字,其中相同的牌每个有四张,例如1砣~9砣,1索~9 ...
- [ZJOI2006]超级麻将(可行性dp)
题目描述 要判断某人是否胡牌,显然一个弱智的算法就行了,某中学信息学小组超级麻将迷想了想,决定将普通麻将改造成超级麻将. 所谓超级麻将没有了砣.索.万的区分,每种牌上的数字可以是1~100,而每种数字 ...
- [bzoj1860 ZJOI2006] 超级麻将 (线性dp)
传送门 Description Input 第一行一个整数N(N<=100),表示玩了N次超级麻将. 接下来N行,每行100个数a1..a100,描述每次玩牌手中各种牌的数量.ai表示数字为i的 ...
- [LUOGU] P2593 [ZJOI2006]超级麻将
f[a][b][c][i]表示考虑到第i个,第i位用了b个,第i-1位用了a个,此时有将/无将(c=1/0)的情况是否可达. 转移分以下几类: 1.调一个将 f[a][b][1][i]|=f[a][b ...
- 洛谷 P2593 [ZJOI2006]超级麻将【dp】
设f[i][j][k][0/1]表示选到i时,i-1选j张,i选k张,之前选的所有牌是否选择了对子 然后分情况讨论转移即可 #include<iostream> #include<c ...
- [Luogu2593] [ZJOI2006]超级麻将
题目地址 :https://www.luogu.org/problemnew/show/P2593. 无脑DP(虽说是抄的额) #include <iostream> #include & ...
- 洛谷2593 [ZJOI2006]超级麻将——可行性dp
题目:https://www.luogu.org/problemnew/show/P2593 发现三个连续牌的影响范围只有3.相同牌的影响范围只有1之后就可以dp了. O(100^7)T飞. #inc ...
- LUOGU 2593 : [Zjoi2006] 超级麻将
传送门 解题思路 直接爆搜全T..状态数太多了,所以我们考虑贪心+剪枝.贪心:先拿三个连着的,再拿四个一样的,再拿三个一样的,最后拿两个一样的这样的搜索顺序最优,两个的放最后是因为只要这样的一个,三个 ...
- bzoj 1860: [Zjoi2006]Mahjong麻将 题解
[原题] 1860: [Zjoi2006]Mahjong麻将 Time Limit: 1 Sec Memory Limit: 64 MB Submit: 211 Solved: 122 [Subm ...
随机推荐
- ControlTemplate 中 Bingding 附加属性时需要加入 Path
<Style TargetType="{x:Type GroupBox}" BasedOn="{StaticResource MaterialDesignGroup ...
- Android开发ListView嵌套ImageView实现单选按钮
做Android开发两年的时间,技术稍稍有一些提升,刚好把自己实现的功能写出来,记录一下,如果能帮助到同行的其他人,我也算是做了件好事,哈哈!!废话不多说,先上个图. 先上一段代码: if (last ...
- es6新语法的使用
1.声明变量: let 声明变量 作用域代码块作用域{} 尽在模块 先使用后声明 会报错 { let a= 12; alert(a) } let 不允许重复声明同一个变量 const 声明是一个常量, ...
- 删除排序数组中的重复数字 - C++
class Solution { public: /** * @param A: a list of integers * @return : return an integer */ int rem ...
- BIEE入门(三)业务模型层
正如它的名字所示(Business Model and Mapping Layer),业务逻辑层需要把物理层的数据源以一种业务用户的视角来重新组织物理层的各个数据源(所谓的Mapping),同时在业务 ...
- Linux --远程访问控制
1.SSH服务端 修改配置文件 vi /etc/ssh/sshd_config 监听选项 port 22 //监听端口地址 ListenAddress 192.168.1.50 //监听地址为本机地址 ...
- 6.Zabbix 3.0 MySQL 监控
请查看我的有道云笔记: http://note.youdao.com/noteshare?id=94cd760a4848939d33892b7464cc0401&sub=8B6EDD27671 ...
- 一、Python安装下载
下载地址:https://www.python.org/downloads/ 因为Python3.X和2.X有部分不兼容,有些不向下兼容,现在3.5的资料和插件少,故我就学习的2.7.11了; 下载后 ...
- SQA计划与测试规程
长大一条龙之SQA计划与测试规程 一.SQA计划 1.软件工程 我们之进行开发之前,在弄完需求分析的前提下,进行了软件一些列的建模和评估,我们建立了基于类的模型图类图,基于场景的模型图流程图,再对这些 ...
- 数字(int)转字符串和字符串转数字(int)
室友去面试,问了一个字符串转成数字的算法题,室友没搞出来,我心想,这个不是很简单的吗?于是动手在纸上画了画代码.画完后,总感觉哪里不对,最后一个个挖掘,才发现,尼玛,这到处都是坑啊---特此记录一下中 ...