出这种麻将题有意思吗?

乍看很难实则很水,就是麻将式DP,想必大家很熟悉了吧。首先把“国士无双”和“七对子”两种牌型判掉,然后观察牌胡的形式,发现每多一张牌实际上就是把1个面子变成1个杠子,然后可以直接DP啦!f[i][j][k][p][q]表示到第i种牌型,(i-2,i-1,i)有j个,(i-1,i,i+1)有k个,然后面子+杠子共p个,q=0/1表示是否有对子的最大值,暴力转移即可。

不知道为啥,luogu满分,LOJ RE成0分,这种垃圾题,不想管了。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int id[]={,,,,,,,,,,,,,};
int mp[],cnt[],vis[],c[][];
ll f[][][][][],g[][];
ll upd(ll&x,ll y){x=x>y?x:y;}
int read()
{
char str[];scanf("%s",str);
if(str[]=='')return ;
if(strlen(str)==)return mp[str[]];
if(str[]=='m')return +str[]-'';
if(str[]=='p')return +str[]-'';
return +str[]-'';
}
ll cal(int x,int y){return(1ll<<(vis[x]?y:))*c[cnt[x]][y];}
ll gsws()
{
memset(g,,sizeof g);
g[][]=;
for(int i=;i<;i++)
for(int j=;j<=;j++)
for(int k=;k<=cnt[id[i+]]&&k<=&&j+k<=;k++)
upd(g[i+][j+k],g[i][j]*cal(id[i+],k));
return *g[][];
}
ll qdz()
{
memset(g,,sizeof g);
g[][]=;
for(int i=;i<;i++)
for(int j=;j<=;j++)
{
upd(g[i+][j],g[i][j]);
if(j<)upd(g[i+][j+],g[i][j]*cal(i+,));
}
return *g[][];
}
ll solve()
{
memset(f,,sizeof f);
f[][][][][]=;
for(int i=;i<;i++)
for(int j=;j<;j++)
if(!j||i>&&(i-)%!=&&(i-)%!=)
for(int k=;k<;k++)
if(!k||i>&&(i-)%!=&&(i-)%!=&&cnt[i+]>=j+k)
for(int p=j+k;p<=;p++)
for(int q=;q<=;q++)
if(f[i][j][k][p][q])
{
for(int a=;a<=&&j+k+a<=cnt[i+]&&p+a<=;a++)
for(int b=;j+k+a+b*<=cnt[i+]&&p+a+b<=;b++)
{
upd(f[i+][k][a][p+a+b][q],f[i][j][k][p][q]*cal(i+,j+k+a+b*));
if(!q&&j+k+a+b*+<=cnt[i+])
upd(f[i+][k][a][p+a+b][],f[i][j][k][p][q]*cal(i+,j+k+a+b*+));
}
if(cnt[i+]-j-k==&&p<)upd(f[i+][k][][p+][q],f[i][j][k][p][q]*cal(i+,));
}
return f[][][][][];
}
int main()
{
mp['E']=,mp['S']=,mp['W']=,mp['N']=,mp['Z']=,mp['B']=,mp['F']=;
for(int i=;i<=;i++)
{
c[i][]=;
for(int j=;j<=i;j++)c[i][j]=c[i-][j]+c[i-][j-];
}
int T,v;scanf("%d",&T);
while(T--)
{
for(int i=;i<=;i++)cnt[i]=,vis[i]=;
while(v=read())cnt[v]--;
while(v=read())vis[v]=;
printf("%lld\n",max(solve(),max(qdz(),gsws())));
}
}

[GX/GZOI2019]宝牌一大堆(DP)的更多相关文章

  1. [LOJ3084][GXOI/GZOI2019]宝牌一大堆——DP

    题目链接: [GXOI/GZOI2019]宝牌一大堆 求最大值容易想到$DP$,但如果将$7$种和牌都考虑进来的话,$DP$状态不好设,我们将比较特殊的七小对和国士无双单独求,其他的进行$DP$. 观 ...

  2. [GXOI/GZOI2019]宝牌一大堆(dp)

    luogu     bzoj 这个麻将题还算挺友善的,比隔壁zjoi的要好得多... 比较正常的做法是五维dp 但事实上六维dp也是完全不会被卡的 七对子选权值最高的七个,国士无双直接$13^2$暴力 ...

  3. P5301 [GXOI/GZOI2019]宝牌一大堆

    题目地址:P5301 [GXOI/GZOI2019]宝牌一大堆 这里是官方题解(by lydrainbowcat) 部分分 直接搜索可以得到暴力分,因为所有和牌方案一共只有一千万左右,稍微优化一下数据 ...

  4. 【BZOJ5503】[GXOI/GZOI2019]宝牌一大堆(动态规划)

    [BZOJ5503][GXOI/GZOI2019]宝牌一大堆(动态规划) 题面 BZOJ 洛谷 题解 首先特殊牌型直接特判. 然后剩下的部分可以直接\(dp\),直接把所有可以存的全部带进去大力\(d ...

  5. luogu P5301 [GXOI/GZOI2019]宝牌一大堆

    传送门 wdnm又是打麻将 首先国土无双可以直接枚举哪种牌用了\(2\)次算贡献,然后\(7\)个对子可以把每种牌的对子贡献排序,取最大的\(7\)个,剩下的牌直接暴力枚举是不行的,考虑dp,设\(f ...

  6. 题解 P5301 【[GXOI/GZOI2019]宝牌一大堆】

    这道题除了非常恶心以外也没有什么非常让人恶心的地方 当然一定要说有的话还是有的,就是这题和咱 ZJOI 的 mahjong 真的是好像的说~ 于是就想说这道题出题人应该被 锕 掉 noteskey 整 ...

  7. [GXOI/GZOI2019]宝牌一大堆

    感觉比ZJOI的麻将要休闲很多啊. 这个题就是一个最优化问题,没有面子的特殊牌型可以直接用复杂度较低的贪心判掉. 有面子的话就是一个经典dp.(曾经还在ZJOI写过这个毒瘤东西 大概就是存一下对子,面 ...

  8. [luogu 5301][bzoj 5503] [GXOI/GZOI2019] 宝牌一大堆

    题面 好像ZJOI也考了一道麻将, 这是要发扬中华民族的赌博传统吗??? 暴搜都不会打, 看到题目就自闭了, 考完出来之后看题解, \(dp\), 可惜自己想不出来... 对于国士无双(脑子中闪过了韩 ...

  9. 【题解】Luogu P5301 [GXOI/GZOI2019]宝牌一大堆

    原题传送门 首先先要学会麻将,然后会发现就是一个暴力dp,分三种情况考虑: 1.非七对子国士无双,设\(dp_{i,j,k,a,b}\)表示看到了第\(i\)种牌,一共有\(j\)个\(i-1\)开头 ...

随机推荐

  1. 第二阶段scrum-2

    1.整个团队的任务量: 2.任务看板: 会议照片: 产品状态: 正在连接配置数据库部分

  2. 吴裕雄--天生自然TensorFlow2教程:张量排序

    import tensorflow as tf a = tf.random.shuffle(tf.range(5)) a tf.sort(a, direction='DESCENDING') # 返回 ...

  3. 吴裕雄--天生自然JAVA SPRING框架开发学习笔记:Java Spring的特点和优点

    Spring 是另一个主流的 Java Web 开发框架,该框架是一个轻量级的应用框架,具有很高的凝聚力和吸引力. Spring 是分层的 Java SE/EE full-stack 轻量级开源框架, ...

  4. POJ 3126:Prime Path

    Prime Path Time Limit: 1000MS   Memory Limit: 65536KB   64bit IO Format: %I64d & %I64u Submit St ...

  5. h5-transform二维变换-盾牌还原案例

    就是8张盾牌的拼图 1 <div class="transforms"> <img src="../img/dp1.png" alt=&quo ...

  6. 9.1hadoop 内置计数器、自定义枚举计数器、Streaming计数器

    1.1  计数器 计数器的作用是用来统计数量的,用于记录特定事件的次数,分为内置计数器.自定义java枚举计数器.自定义Stream计数器三大类.用于质量分析,或应用级统计.分析计数器的值比分析一堆日 ...

  7. CodeForces - 686D 【树的重心】

    传送门:http://codeforces.com/problemset/problem/686/D 题意:给你n个节点,其中1为根, 第二行给你2~n的节点的父亲节点编号. 然后是q个询问,求询问的 ...

  8. Python Learning Day2

    练习:login功能 def login(): with open(r'C:\Users\liubin\desktop\user.txt','r') as f: res=f.read() flag=1 ...

  9. UVALive 3942 字典树+dp

    其实主要是想学一下字典树的写法,但这个题目又涉及到了DP:这个题目要求某些单词组成一个长子串的各种组合总数,数据量大,单纯枚举复杂度高,首先肯定是要把各个单词给建成字典树,但是之后该怎么推一时没想到. ...

  10. java AES加解密

    AES加解密工具类 package com.yan.demo; import org.apache.commons.lang3.StringUtils; import sun.misc.BASE64D ...