出这种麻将题有意思吗?

乍看很难实则很水,就是麻将式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. php base64编码图片上传七牛

    上网上找了好几个例子 都是自己写curl上传 感觉七牛这么多年了不应该sdk不提供一个方法 然后试 试 试 显示put 方式 上传上去 就是个字符串 后来换成文件上传方法 putFile 成了 不废话 ...

  2. Vue v-bind

    指令作用: 给元素的属性赋值 它是一个 vue 指令,用于绑定 html 属性 写法: 正常写法 <div v-bind:原属性名="变量||"常量""& ...

  3. APP中H5页面调试神器

    Fiddler Web Debugging Tool for Free by Telerik window 可以 下载,然后我的H5 嵌入到 APP 里面就可以快速捕捉到接口啦.不会因为看不见就得靠“ ...

  4. STL学习顺序

    仅供参考,大家要学会自己制作,很有成就感的啊! 先看<c++标准程序库>这本书很厚,但是其实很简单,然后再看effective stl,注意顺序,我初学的时候stl还没了解多少就看effe ...

  5. MFC下的网络编程(1)CAsyncSocket进行无连接(UDP)通信

    服务器端发送数据给客户端 先看服务器端: CAsyncSocket m_sockSend;                       //声明一个Socket对象 点击发送数据后,执行下面这些动作 ...

  6. Idea 中的快捷键(mac)

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

  7. JZOJ-2019-11-7 A组

    T1 Input 从文件 awesome.in 中读入数据. 第一行 2 个用空格隔开的整数 \(n\), \(P\). 第二行 n 个用空格隔开的整数 \(A_1, \cdots , A_n\). ...

  8. html_位置偏移属性position

    定位属性 位置属性position:static.relative.absolute.fixed 偏移属性:top.bottom.left.right 浮动定位属性:float/clear 1.浮动定 ...

  9. React编写组件的局部样式

    我们都知道,在Vue的单文件组件中,style标签中编写的样式默认为全局样式,如果我们想编写局部样式, 使用一个scoped关键字就可以. 那么在React中怎么实现呢? (注: 这种方法必须使用类选 ...

  10. PAT Advanced 1086 Tree Traversals Again (25) [树的遍历]

    题目 An inorder binary tree traversal can be implemented in a non-recursive way with a stack. For exam ...