出这种麻将题有意思吗?

乍看很难实则很水,就是麻将式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. JS元素的左右移动

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  2. Java中多态的实例

    public class cf { /** * 实际上这里涉及方法调用的优先问题, * 优先级由高到低依次为:this.show(O).super.show(O).this.show((super)O ...

  3. 从架构师视角看是否该用Kotlin做服务端开发?

    前言 自从Oracle收购Sun之后,对Java收费或加强控制的尝试从未间断,谷歌与Oracle围绕Java API的官司也跌宕起伏.虽然Oracle只是针对Oracle JDK8的升级收费,并释放了 ...

  4. 微服务基础——厉害了!API网关

    微服务刚刚诞生的时候,人们将服务进行拆分,实现服务之间的松耦合,并且每个服务有专门的团队维护,然后客户端直接和各个子服务进行交互.比如,订单,商品,会员服务. 那么这种客户端直接和后端服务交互的方式会 ...

  5. (6)Mat对象的一些函数和方法的使用

    首先是基本的代码整理 #include<iostream> #include<opencv.hpp> using namespace std; using namespace ...

  6. Idea 中的快捷键(mac)

    Mac键盘符号和修饰键说明 ⌘ Command ⇧ Shift ⌥ Option ⌃ Control ↩︎ Return/Enter ⌫ Delete ⌦ 向前删除键(Fn+Delete) ↑ 上箭头 ...

  7. 线上环境 分析java问题 常见命令

    在生产上进程需要分析jvm运行情况,今天分享几个自己常用的命令,持续更新,欢迎补充 1.jps jstack -l {pid} > jstack.log #查看线程快照信息 2.jps jmap ...

  8. quartz 集成到Spring中

    记录一下,防止忘记. 需要的jar包,quartz-2.2.3.jar,commons-collection-3.1.jar,spring-context-support-4.3.4.RELEASE. ...

  9. Redhat7 开机启动服务

    #!/bin/sh ### BEGIN INIT INFO # Provides: jboss # Required-Start: $local_fs $remote_fs $network $sys ...

  10. 18个Java8日期处理的实践,太有用了

    专注于Java领域优质技术,欢迎关注 作者:胖先森 Java 8 推出了全新的日期时间API,在教程中我们将通过一些简单的实例来学习如何使用新API. Java处理日期.日历和时间的方式一直为社区所诟 ...