传送门

解题思路

直接爆搜全T。。状态数太多了,所以我们考虑贪心+剪枝。贪心:先拿三个连着的,再拿四个一样的,再拿三个一样的,最后拿两个一样的这样的搜索顺序最优,两个的放最后是因为只要这样的一个,三个连着的放开头是因为这样可以照顾到后面很少的情况。这样肯定还是T,我们考虑剪枝,用hash减。考虑如果数据为

12 0 1 0 0 0…. 这样的 ,我们第一种搜的方案是 a[1]里拿三个4,后面发现不行,返回。第二种方案是a[1]拿四个3,发现这两种方案拿完a[1]后 剩下的序列都是0 1 0 0…,所以将剩下的序列hash一下存到set里,如果再次遇到就直接返回false,注意这里直接去模会T的很惨,所以要用到unsigned long long 里的自然溢出。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<set>
#define ULL unsigned long long using namespace std;
const int MAXN = 105;
const ULL base = 131ll; int n,a[MAXN];
ULL hash[MAXN],sum;
set<ULL> s; bool dfs(int x,bool two,ULL S){
if(s.find(S)!=s.end()) return 0;
s.insert(S);
while(a[x]==0 && x<=100) x++;
if(x==101) return two;
if(a[x]>0 && a[x+1]>0 && a[x+2]>0) {
a[x]--;a[x+1]--;a[x+2]--;
if(dfs(x,two,S-hash[x]-hash[x+1]-hash[x+2])) return 1;
a[x]++;a[x+1]++;a[x+2]++;
}
if(a[x]>=4) {
a[x]-=4;
if(dfs(x,two,S-hash[x]*4)) return 1;
a[x]+=4;
}
if(a[x]>=3){
a[x]-=3;
if(dfs(x,two,S-hash[x]*3)) return 1;
a[x]+=3;
}
if(a[x]>=2 && !two){
a[x]-=2;
if(dfs(x,1,S-hash[x]*2-hash[100])) return 1;
a[x]+=2;
}return 0;
} int main(){
// freopen("rand.txt","r",stdin);
// freopen("B.txt","w",stdout);
scanf("%d",&n);
hash[1]=1ll;
for(register int i=2;i<=100;i++) {
hash[i]=hash[i-1]*base;
}
for(register int i=1;i<=n;i++){
sum=0;
for(register int j=1;j<=100;j++){
scanf("%d",&a[j]);sum+=hash[j]*a[j];
}
s.clear();
puts(dfs(1,0,sum)==true?"Yes":"No");
}
return 0;
}

LUOGU 2593 : [Zjoi2006] 超级麻将的更多相关文章

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

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

  2. [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 ...

  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. 洛谷 P2593 [ZJOI2006]超级麻将【dp】

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

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

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

随机推荐

  1. System.Web.Mvc.ViewResultBase.cs

    ylbtech-System.Web.Mvc.ViewResultBase.cs 1.程序集 System.Web.Mvc, Version=5.2.3.0, Culture=neutral, Pub ...

  2. Thrift(PHP)入门无错篇章(一)

    一.安装篇 博主注:截至2017-10-10,官网上thrift最新版0.10.0一直无法成功编译.所以,请选择0.9.3版本,避免走各种弯路: wget http://apache.fayea.co ...

  3. day 42 03--CSS布局设置

      03--CSS布局设置   本节目录 一 盒模型 二 padding(内边距) 三 boder(边框) 四 简单认识一下margin(外边距) 五 标准文档流 六 块级元素和行内元素 七 浮动 八 ...

  4. Python学习之while练习--九九乘法表

    效果如下: 实现代码; m = 1n = 1while(m<10): while(n<=m): print(n,"*",m,"=",m*n,end ...

  5. 编程之法:面试和算法心得(旋转字符串java实现)

    内容全部来自编程之法:面试和算法心得一书,实现是自己写的使用的是java 题目描述 给定一个字符串,要求把字符串前面的若干个字符移动到字符串的尾部,如把字符串“abcdef”前面的2个字符'a'和'b ...

  6. hive报错( Non-Partition column appears in the partition specification)

    在写及测的过程中发现的,有一些可能需要进一步验证.有时候hive报错位置不一定正确需要多确认 1 FAILED: NullPointerException null 不能用视图作为left outer ...

  7. HZOI2019 星际旅行 欧拉路

    题目大意:https://www.cnblogs.com/Juve/articles/11207540.html—————————> 题解:网上都是一句话题解:将所有的边拆成两条,问题变成去掉两 ...

  8. element-ui 使用笔记

    1,获取级联选择器 cascader的值 获取value值:就是v-model绑定的值, 获取label值:要先给cascader组件一个ref值,然后通过 this.$refs.组件的ref值.cu ...

  9. Delphi 设计模式:《HeadFirst设计模式》Delphi代码---工厂模式之抽象工厂[转]

     1  2 {<HeadFirst设计模式>工厂模式之抽象工厂 }  3 { 抽象工厂的产品                       }  4 { 编译工具:Delphi7.0     ...

  10. Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---模板方法模式之CoffeineBeverageWithHook[转]

    模板方法模式定义了一个算法骨架,允许子类对算法的某个或某些步骤进行重写(override).   1   2{<HeadFirst设计模式>之模板方法模式 }   3{ 编译工具: Del ...