LOJ#3084. 「GXOI / GZOI2019」宝牌一大堆(递推)
题面
题解
为什么又是麻将啊啊啊!而且还是我最讨厌的爆搜类\(dp\)……
首先国士无双和七对子是可以直接搞掉的,关键是剩下的,可以看成\(1\)个雀头加\(4\)个杠子或面子
直接\(dp\),设\(f[i][j][k][l][x][y]\)表示考虑前\(i\)种牌,以第\(i-2\)种牌为开头的顺子张数为\(j\),以\(i-1\)为开头的顺子张数为\(k\),以\(i\)开头的顺子张数为\(l\),杠子加面子总数为\(x\),雀头个数为\(y\),的最大权值
注意一些边界条件,比方说以某一种牌开头的顺子选的不需要超过\(2\)个,因为如果选了\(3\)个完全可以拆成刻子。还有有的时候以某种牌为开头的顺子可能不合法。以及牌数加起来不能超
这里其实可以把\(l\)这一维用滚动数组滚掉
代码基本都是抄\(fcw\)的
//minamoto
#include<bits/stdc++.h>
#define R register
#define ll long long
#define inline __inline__ __attribute__((always_inline))
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
using namespace std;
const int N=55;
inline ll max(R ll x,R ll y){return x>y?x:y;}
ll bin[N],C[N][N];int a[N],b[N];
inline ll ch(R int x,R int v){return C[a[x]][v]*bin[b[x]*v];}
int id(char *w){
if(strlen(w+1)==2){
switch(w[2]){
case 'm':return w[1]-'0';
case 'p':return 9+w[1]-'0';
case 's':return 18+w[1]-'0';
}
}else{
switch(w[1]){
case 'E':return 28;
case 'W':return 29;
case 'N':return 30;
case 'S':return 31;
case 'Z':return 32;
case 'B':return 33;
case 'F':return 34;
}
}
return -1;
}
ll c[N];
ll solve1(){
ll res=1;
fp(i,1,34)c[i]=ch(i,2);
sort(c+1,c+1+34);
fp(i,28,34)res*=c[i];return res*7;
}
int d[20]={0,1,9,10,18,19,27,28,29,30,31,32,33,34};
ll solve2(){
ll res=0,tmp;
fp(i,1,13){
tmp=ch(d[i],2);
fp(j,1,13)if(i!=j)tmp*=ch(d[j],1);
cmax(res,tmp);
}return res*13;
}
ll f[35][3][3][5][2];
ll solve3(){
memset(f,0,sizeof(f)),f[0][0][0][0][0]=1;
fp(i,0,34){
fp(j,0,2)if(!j||(i<=27&&i%9!=0&&i%9!=1)){
fp(k,0,2)if(!k||(i<=27&&i%9!=8&&i%9!=0))
if(a[i+1]>=j+k){
fp(x,j+k,4)fp(y,0,1)if(f[i][j][k][x][y]){
for(R int z=0;z<=2&&j+k+z<=a[i+1]&&x+z<=4;++z)
for(R int w=0;j+k+z+w*3<=a[i+1]&&x+z+w<=4;++w){
int t=j+k+z+w*3;
cmax(f[i+1][k][z][x+z+w][y],f[i][j][k][x][y]*ch(i+1,t));
if(!y&&t+2<=a[i+1])cmax(f[i+1][k][z][x+z+w][1],f[i][j][k][x][y]*ch(i+1,t+2));
}
if(a[i+1]-j-k==4&&x<4)cmax(f[i+1][k][0][x+1][y],f[i][j][k][x][y]*ch(i+1,4));
}
}
}
}
return f[34][0][0][4][1];
}
void init(){
bin[0]=1;fp(i,1,18)bin[i]=bin[i-1]<<1;
fp(i,0,4){
C[i][0]=1;
fp(j,1,i)C[i][j]=C[i-1][j-1]+C[i-1][j];
}
}
char w[15];
void solve(){
fp(i,1,34)a[i]=4,b[i]=0;
while(true){
scanf("%s",w+1);
if(w[1]=='0')break;
--a[id(w)];
}
while(true){
scanf("%s",w+1);
if(w[1]=='0')break;
b[id(w)]=1;
}
printf("%lld\n",max(solve1(),max(solve2(),solve3())));
}
int main(){
// freopen("testdata.in","r",stdin);
int T;scanf("%d",&T);init();
while(T--)solve();
return 0;
}
LOJ#3084. 「GXOI / GZOI2019」宝牌一大堆(递推)的更多相关文章
- 「GXOI / GZOI2019」宝牌一大堆 (DP)
题意 LOJ传送门 题解 可以发现「七对子」 和 「国士无双」直接暴力就行了. 唯一的就是剩下的"3*4+2". 考试的时候写了个爆搜剪枝,开了O2有50pts.写的时候发现可以D ...
- Loj #3085. 「GXOI / GZOI2019」特技飞行
Loj #3085. 「GXOI / GZOI2019」特技飞行 题目描述 公元 \(9012\) 年,Z 市的航空基地计划举行一场特技飞行表演.表演的场地可以看作一个二维平面直角坐标系,其中横坐标代 ...
- LOJ#3083.「GXOI / GZOI2019」与或和_单调栈_拆位
#3083. 「GXOI / GZOI2019」与或和 题目大意 给定一个\(N\times N\)的矩阵,求所有子矩阵的\(AND(\&)\)之和.\(OR(|)\)之和. 数据范围 \(1 ...
- LOJ#3088. 「GXOI / GZOI2019」旧词(树剖+线段树)
题面 传送门 题解 先考虑\(k=1\)的情况,我们可以离线处理,从小到大对于每一个\(i\),令\(1\)到\(i\)的路径上每个节点权值增加\(1\),然后对于所有\(x=i\)的询问查一下\(y ...
- LOJ#3087. 「GXOI / GZOI2019」旅行者(最短路)
题面 传送门 题解 以所有的感兴趣的城市为起点,我们正着和反着各跑一边多源最短路.记\(c_{0/1,i}\)分别表示正图/反图中离\(i\)最近的起点,那么对于每条边\((u,v,w)\),如果\( ...
- LOJ#3086. 「GXOI / GZOI2019」逼死强迫症(矩阵快速幂)
题面 传送门 题解 先考虑全都放\(1\times 2\)的方块的方案,设防\(i\)列的方案数为\(g_i\),容易推出\(g_i=g_{i-1}+g_{i-2}\),边界条件为\(g_0=g_1= ...
- LOJ#3085. 「GXOI / GZOI2019」特技飞行(KDtree+坐标系变换)
题面 传送门 前置芝士 请确定您会曼哈顿距离和切比雪夫距离之间的转换,以及\(KDtree\)对切比雪夫距离的操作 题解 我们发现\(AB\)和\(C\)没有任何关系,所以关于\(C\)可以直接暴力数 ...
- LOJ#3083. 「GXOI / GZOI2019」与或和(单调栈)
题面 传送门 题解 按位考虑贡献,如果\(mp[i][j]\)这一位为\(1\)就设为\(1\)否则设为\(0\),对\(or\)的贡献就是全为\(1\)的子矩阵个数,对\(and\)的贡献就是总矩阵 ...
- 「GXOI / GZOI2019」简要题解
「GXOI / GZOI2019」简要题解 LOJ#3083. 「GXOI / GZOI2019」与或和 https://loj.ac/problem/3083 题意:求一个矩阵的所有子矩阵的与和 和 ...
随机推荐
- TabIndex 属性 Tabindex="-1" 与Tabindex="0"、任意数字 (收录)
TabIndex 属性 Tabindex="-1" 与Tabindex="0".任意数字 html中的tabIndex属性可以设置键盘中的TAB键在控件中的移动 ...
- java 主类的main方法调用其他方法
方法1:A a=new test().new A(); 内部类对象通过外部类的实例对象调用其内部类构造方法产生,如下: public class test{ class A{ void fA(){ S ...
- abp AutoMap Custom Mapping
[DependsOn(typeof(AbpAutoMapperModule))] public class MyModule : AbpModule { public override void Pr ...
- kubernetes 1.6 RBAC访问控制
一.简介 之前,Kubernetes中的授权策略主要是ABAC(Attribute-Based Access Control).对于ABAC,Kubernetes在实现上是比较难用的,而且需要Mast ...
- Nginx学习基础(一)
Nginx是个可靠高效的中间件,就是跟其他语言连接,可以做为一个工具的服务器. 可以处理的问题: 1.反向代理 (1)正向代理(以客户端为主):访问网站的时候,早起是在做通过n多个路由访问网站的操作, ...
- Android 4.3实现类似iOS在音乐播放过程中如果有来电则音乐声音渐小铃声渐大的效果
目前Android的实现是:有来电时,音乐声音直接停止,铃声直接直接使用设置的铃声音量进行铃声播放. Android 4.3实现类似iOS在音乐播放过程中如果有来电则音乐声音渐小铃声渐大的效果. 如果 ...
- 大数据项目中js中代码和java中代码(解决Tomcat打印日志中文乱码)
Idea2018中集成Tomcat9导致OutPut乱码找到tomcat的安装目录,打开logging.properties文件,增加一行代码,覆盖默认设置,将日志编码格式修改为GBK.java.ut ...
- An error "Host key verification failed" when you connect to other computer by OSX SSH
Here's quick way to remove all entries in the host file: In an OSX terminal, type rm -f ~/.ssh/known ...
- Lucene教程(四) 索引的更新和删除
这篇文章是基于上一篇文章来写的,使用的是IndexUtil类,下面的例子不在贴出整个类的内容,只贴出具体的方法内容. 3.5版本: 先写了一个check()方法来查看索引文件的变化: /** ...
- Jurassic.ScriptEngine 使用
标记: Jurassic,js,net Jurassic.ScriptEngine是一个让net动态执行js的一个引擎.类似的有ironjs等.支持ECMAScript 5,非线程安全 使用 usin ...