[GX/GZOI2019]宝牌一大堆(DP)
出这种麻将题有意思吗?
乍看很难实则很水,就是麻将式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)的更多相关文章
- [LOJ3084][GXOI/GZOI2019]宝牌一大堆——DP
题目链接: [GXOI/GZOI2019]宝牌一大堆 求最大值容易想到$DP$,但如果将$7$种和牌都考虑进来的话,$DP$状态不好设,我们将比较特殊的七小对和国士无双单独求,其他的进行$DP$. 观 ...
- [GXOI/GZOI2019]宝牌一大堆(dp)
luogu bzoj 这个麻将题还算挺友善的,比隔壁zjoi的要好得多... 比较正常的做法是五维dp 但事实上六维dp也是完全不会被卡的 七对子选权值最高的七个,国士无双直接$13^2$暴力 ...
- P5301 [GXOI/GZOI2019]宝牌一大堆
题目地址:P5301 [GXOI/GZOI2019]宝牌一大堆 这里是官方题解(by lydrainbowcat) 部分分 直接搜索可以得到暴力分,因为所有和牌方案一共只有一千万左右,稍微优化一下数据 ...
- 【BZOJ5503】[GXOI/GZOI2019]宝牌一大堆(动态规划)
[BZOJ5503][GXOI/GZOI2019]宝牌一大堆(动态规划) 题面 BZOJ 洛谷 题解 首先特殊牌型直接特判. 然后剩下的部分可以直接\(dp\),直接把所有可以存的全部带进去大力\(d ...
- luogu P5301 [GXOI/GZOI2019]宝牌一大堆
传送门 wdnm又是打麻将 首先国土无双可以直接枚举哪种牌用了\(2\)次算贡献,然后\(7\)个对子可以把每种牌的对子贡献排序,取最大的\(7\)个,剩下的牌直接暴力枚举是不行的,考虑dp,设\(f ...
- 题解 P5301 【[GXOI/GZOI2019]宝牌一大堆】
这道题除了非常恶心以外也没有什么非常让人恶心的地方 当然一定要说有的话还是有的,就是这题和咱 ZJOI 的 mahjong 真的是好像的说~ 于是就想说这道题出题人应该被 锕 掉 noteskey 整 ...
- [GXOI/GZOI2019]宝牌一大堆
感觉比ZJOI的麻将要休闲很多啊. 这个题就是一个最优化问题,没有面子的特殊牌型可以直接用复杂度较低的贪心判掉. 有面子的话就是一个经典dp.(曾经还在ZJOI写过这个毒瘤东西 大概就是存一下对子,面 ...
- [luogu 5301][bzoj 5503] [GXOI/GZOI2019] 宝牌一大堆
题面 好像ZJOI也考了一道麻将, 这是要发扬中华民族的赌博传统吗??? 暴搜都不会打, 看到题目就自闭了, 考完出来之后看题解, \(dp\), 可惜自己想不出来... 对于国士无双(脑子中闪过了韩 ...
- 【题解】Luogu P5301 [GXOI/GZOI2019]宝牌一大堆
原题传送门 首先先要学会麻将,然后会发现就是一个暴力dp,分三种情况考虑: 1.非七对子国士无双,设\(dp_{i,j,k,a,b}\)表示看到了第\(i\)种牌,一共有\(j\)个\(i-1\)开头 ...
随机推荐
- 201771010123汪慧和《面向对象程序设计Java》第十二周实验总结
一.理论部分 1.在Java提供的GUI构建工具中可以分为组件和容器两类. 2.在Java中的组件有:按钮.标签.复选框.单选按钮.选择框.列表框.文本框.滚动条.画布.菜单. 3.在Java中的容器 ...
- swiper用axios异步请求后 循环失效
解决方案 使用ajax动态获取数据 当数据还没有收到的时候,swiper组件收到的是跟组件data传过来的空数组,会造成渲染问题 这个时候可以给swiper组件 设置一个 v-if='list.l ...
- Class.forName(String className)解析
功能: Class.forName(xxx.xx.xx)返回的是一个类 Class.forName(xxx.xx.xx)的作用是要求JVM查找并加载指定的类, 也就是说JVM会执行该类的静态代码段 一 ...
- JavaScript 之 原型及原型链
对象[回顾] 通过字面量创建对象 //通过字面量创建对象 var obj1 = { name:'Jack', age: 18 } 通过系统自带的构造函数构造对象 // 通过系统自带的构造函数构造对象 ...
- 2019.3.11 JavaScript课上笔记
---恢复内容开始--- 字面值写到左边 var x= "1"; ++x .x++ // 都有隐式类型转换 x += 1; // 是字符串的拼接 === 判断引用的对象是不是同一 ...
- apache安装和mysql php配置问题
apache下载和安装: 下载网址:http://httpd.apache.org/ 然后 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~ ...
- docker入门1---docker的简介和安装
Tomxin7 Simple, Interesting | 简单,有趣 什么是Docker? 简介: Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的.可移植的.自给自足的容器.开发 ...
- jboss的JVMroute记录
jboss5的nodename是在 /usr/local/jboss-5.1.0.GA/server/dms/deploy/jbossweb.sar/server.xml 这里的 jvmrout ...
- py02_04:三元运算法
a if a > b else c # a>b 成立,则为真,如果a>b为假,则返回c
- 25.docker compose 简介 和 docker-compose.yml 参数介绍
1. docker compose概念 文档 https://docs.docker.com/compose/compose-file/compose-versioning 一个基于 docker ...