题面

传送门

题解

为什么又是麻将啊啊啊!而且还是我最讨厌的爆搜类\(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;
}

转载于:https://www.cnblogs.com/bztMinamoto/p/10719609.html

LOJ#3084. 「GXOI / GZOI2019」宝牌一大堆(递推)相关推荐

  1. 【LOJ #3084】【GXOI / GZOI2019】—宝牌一大堆(DP)

    传送门 首先把国士无双和七对子判掉 实际上可以发现杠根本没用 因为(43)>(44)∗2{4\choose 3}>{4\choose 4}*2(34​)>(44​)∗2 设f[i][ ...

  2. loj #3086. 「GXOI / GZOI2019」逼死强迫症

    背景: 好像也没什么. 题目传送门: https://loj.ac/problem/3086 题意: 给一个2∗n2*n2∗n的矩阵,现在要用2∗(n−1)2*(n-1)2∗(n−1)的矩形和222块 ...

  3. LOJ#3085. 「GXOI / GZOI2019」特技飞行(KDtree+坐标系变换)

    题面 传送门 前置芝士 请确定您会曼哈顿距离和切比雪夫距离之间的转换,以及\(KDtree\)对切比雪夫距离的操作 题解 我们发现\(AB\)和\(C\)没有任何关系,所以关于\(C\)可以直接暴力数 ...

  4. LOJ#3086. 「GXOI / GZOI2019」逼死强迫症(矩阵快速幂)

    题面 传送门 题解 先考虑全都放\(1\times 2\)的方块的方案,设防\(i\)列的方案数为\(g_i\),容易推出\(g_i=g_{i-1}+g_{i-2}\),边界条件为\(g_0=g_1= ...

  5. 【GXOI/GZOI2019】宝牌一大堆(麻将DP)(贪心)

    传送门 其实还有第三种麻将--四川麻将,规则和其他麻将都不太像,甚至在四川不同地区的规则也不一样. 而关于麻将胡牌的题,能够利用DP解决的,我们可以将这种技巧成为麻将DP 题解: 这篇题解里面用的是川 ...

  6. 【LOJ】#3086. 「GXOI / GZOI2019」逼死强迫症

    LOJ#3086. 「GXOI / GZOI2019」逼死强迫症 这个就是设状态为\(S,j\)表示轮廓线为\(S\),然后用的1×1个数为j 列出矩阵转移 这样会算重两个边相邻的,只要算出斐波那契数 ...

  7. 「GXOI / GZOI2019」逼死强迫症——斐波那契+矩阵快速幂

    题目 [题目描述] ITX351 要铺一条 $2 \times N$ 的路,为此他购买了 $N$ 块 $2 \times 1$ 的方砖.可是其中一块砖在运送的过程中从中间裂开了,变成了两块 $1 \t ...

  8. Loj #3124. 「CTS2019 | CTSC2019」氪金手游

    Loj #3124. 「CTS2019 | CTSC2019」氪金手游 题目描述 小刘同学是一个喜欢氪金手游的男孩子. 他最近迷上了一个新游戏,游戏的内容就是不断地抽卡.现在已知: - 卡池里总共有 ...

  9. LOJ#3054. 「HNOI 2019」鱼

    LOJ#3054. 「HNOI 2019」鱼 https://loj.ac/problem/3054 题意 平面上有n个点,问能组成几个六个点的鱼.(n<=1000) 分析 鱼题,劲啊. 容易想 ...

最新文章

  1. html图片加波浪滤镜,CSS滤镜wave属性(波形滤镜)
  2. MySQL命令之mysqldump的选项详解
  3. abovedisplayskip无效_初学latex的模板,里面有错,哪位大神能不能帮忙看看啊?不甚感激!...
  4. 海康威视网络摄像头管理员登录密码重置
  5. 随处可用的坐姿小帮手,还能按摩热敷,荣泰P30按摩坐垫体验
  6. 人工神经网络——学习策略
  7. 随手写了一段C++访问LDAP, 并且获取sid的代码
  8. LIN雨量传感器:拆解最低配的传感器8U0955559
  9. 2018年春招实习面试经验总结
  10. Android 手机重启相关内容
  11. OA系统以项目管理为中心,为会计事务所打造内外协同一体化平台
  12. ‘step’的调用中是否存在不正确的参数数据类型或缺少参数
  13. 利用python open-cv aimageio完成avi png mp4 gif间的转换
  14. 微软应用商店_对手变战友!苹果iCloud正式登陆微软官方应用商店
  15. ˆ和^ 在overleaf中的误用 次方公式的使用
  16. 石油、化工 工程上都在用的地下管线探测仪---TFN A1200
  17. pdf如何去除水印文字?这个办法值得一试
  18. Python—md5加密
  19. elasticsearch 8.3版本安装和集群部署
  20. 配置NHibernate

热门文章

  1. 从爆红到凉凉,「蚂蚁呀嘿」只用了 7 天
  2. 下列哪项不是python中对文件的读取操作-Python—文件读写操作
  3. 20181212股票复盘
  4. The default interactive shell is now zsh.
  5. 23hh小说网——爬虫python
  6. 我的青春我做主——80后提前的中年危机 / 陆琪
  7. Re5ilio 5ync:资源神器
  8. 自制肥鲨HDO2电源降压延长线,支持3S~6S动力电池
  9. HRM认证授权方案_新版
  10. 操作系统笔记(王道)(持续更新中)