出这种麻将题有意思吗?

乍看很难实则很水,就是麻将式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. mariadb主从

    实验环境: 两台centos7 master:192.168.1.6 slave:192.168.1.7 一.安装mariadb服务 [root@master ~]# yum -y install m ...

  2. python可移植支持代码;用format.节省打印输出参数代码;math模块;

    1.多平台移植代码: #!/usr/bin/env python3 这一行比较特殊,称为 shebang 行,在 Python 脚本中,你应该一直将它作为第一行. 请注意行中的第一个字符是井号(#). ...

  3. 布局基础<kotlin>2,自定义控件(整理自网络)

    引导页 传送门 Android vector标签 PathData 画图 ViewPager 代码清单 activity_main.xml <?xml version="1.0&quo ...

  4. numpy ndarray 打印格式化

    1.ndarray打印省略问题 np.set_printoptions(threshold=np.inf) 2.ndarray打印换行限制 加上下面这句代码,输出时打印不换行 np.set_print ...

  5. ✨vue引入组件 axios和icont矢量图标

    axios 在vue项目开发中,我们使用axios进行ajax请求,很多人一开始使用axios的方式,会当成vue-resoure的使用方式来用,即在主入口文件引入import VueResource ...

  6. UVA - 1630 Folding(串折叠)(dp---记忆化搜索)

    题意:给出一个由大写字母组成的长度为n(1<=n<=100)的串,“折叠”成一个尽量短的串.折叠可以嵌套.多解时可输出任意解. 分析: 1.dp[l][r]为l~r区间可折叠成的最短串的长 ...

  7. POJ 1562:Oil Deposits

    Oil Deposits Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 14462   Accepted: 7875 Des ...

  8. HttpClient系列~StringContent与FormUrlEncodedContent

    知识点 本文是一个很另类的文章,在项目中用的比较少,但如果项目中真的出现了这种情况,我们也需要知道如何去解决,对于知识点StringContent和FormUrlEncodedContent我们应该了 ...

  9. 教你如何使用JavaScript入门

    JavaScript简介   JavaScript是NetScape公司为Navigator浏览器开发的,是web前端卸载HTML文件中的一种脚本语言,能实现网页内容的交互显示.当用户在客户端显示该网 ...

  10. UML-迭代3-中级主题

    初始阶段和迭代1:揭示了大量面向对象分析和设计建模的基础知识. 迭代2:特别强调对象设计模式 迭代3:涉及主题比较宽泛: 1).更多GoF设计模式及其在框架(尤其是一个持久化框架)的设计中的应用. 2 ...