传送门


其实还有第三种麻将——四川麻将,规则和其他麻将都不太像,甚至在四川不同地区的规则也不一样。

而关于麻将胡牌的题,能够利用DP解决的,我们可以将这种技巧成为麻将DP

题解:

这篇题解里面用的是川麻的语言习惯。

首先注意到杠子是废的,我们永远不可能考虑用一个杠子代替一个刻子,因为它权值永远小于刻子。(没注意到没关系,反正写到DP里面杠子的转移就一行)

国士无双可以直接枚举重复的那个是什么 O ( 1 3 3 ) O(13^3) O(133)暴力算。

七对子显然直接选权值最大的7个就行了。

那么考虑普通胡牌。

同类型的顺子不可能出现两次以上,如果出现了三次,我们可以用三个刻子代替。

那么DP状态就很好设计了:

设 f [ i ] [ j ] [ k ] [ l ] [ 0 / 1 ] f[i][j][k][l][0/1] f[i][j][k][l][0/1]表示当前考虑了前 i i i种牌,已经确定组成的面子有 j j j个,以 i − 1 i-1 i−1开头的顺子有 k k k个,以 i i i开头的顺子有 l l l个(注意这两种顺子是未确定的),是否包含一个对子,的最大权值。

转移大力分类讨论,注意不要把不该顺上的牌连上了。

代码里面的两个函数国士无双和七对子用的是日语罗马音。


代码:

#include<bits/stdc++.h>
#define ll long long
#define re register
#define cs constusing std::cin;
using std::cout;
using std::cerr;
inline void ckmax(ll &a,ll b){a=a<b?b:a;}cs ll c[5][5]={{1},{1,1},{1,2,1},{1,3,3,1},{1,4,6,4,1}
};/*万子:1~9
筒子:10~18
条子:19~27东西南北中白发:28~34; */cs int kokushi[]={1,9,10,18,19,27,28,29,30,31,32,33,34};
ll a[39],b[39];
ll f[39][5][4][4][2];inline ll kokushimuso(){for(int re i:kokushi)if(a[i]==0)return 0;ll ans=0,tmp;for(int re i:kokushi){if(a[i]<2)continue;tmp=1;for(int re j:kokushi)if(i==j)tmp*=c[a[j]][2]*b[j]*b[j];else tmp*=c[a[j]][1]*b[j];ckmax(ans,tmp);}return ans*13;
}inline ll nanakumi(){static int val[34],cnt;cnt=0;for(int re i=1;i<=34;++i)if(a[i]>1)val[++cnt]=c[a[i]][2]*b[i]*b[i];if(cnt<7)return 0;ll ans=1;std::sort(val+1,val+cnt+1);for(int re i=cnt;i>cnt-7;--i)ans*=val[i];return ans*7;
}inline ll dp(){memset(f,0,sizeof f);f[0][0][0][0][0]=1;for(int re i=0;i<34;++i)for(int re j=0;j<=4;++j)for(int re k=0;k<3&&k+j<=4;++k){if(k&&(i==9||i==18||i>=27))break;for(int re l=0;l<3&&l+k+j<=4;++l){if(l&&(i==9||i==18||i>=27))break;if(!f[i][j][k][l][0]&&!f[i][j][k][l][1])continue;ll v0=f[i][j][k][l][0],v1=f[i][j][k][l][1];for(int re t=0;t<=a[i+1]-k-l;++t){int tot=t+k+l;ll tr=c[a[i+1]][tot]*(b[i+1]==2?1ll<<tot:1);if(j+tot<=4&&t<3){ckmax(f[i+1][j+k][l][t][0],v0*tr);ckmax(f[i+1][j+k][l][t][1],v1*tr);}if(t>=2&&j+tot-2<=4){ckmax(f[i+1][j+k][l][t-2][1],v0*tr);}if(t>=3&&j+tot-2<=4){ckmax(f[i+1][j+k+1][l][t-3][0],v0*tr);ckmax(f[i+1][j+k+1][l][t-3][1],v1*tr);}}}}return f[34][4][0][0][1];
}signed main(){#ifdef zxyoifreopen("kokushi.in","r",stdin);
#endifstd::ios::sync_with_stdio(false);int T;cin>>T;std::string s;while(T--){for(int re i=1;i<=34;++i)a[i]=4,b[i]=1;while(true){cin>>s;if(s.size()==1){if(s[0]=='0')break;switch(s[0]){case 'E':--a[28];break;case 'S':--a[29];break;case 'W':--a[30];break;case 'N':--a[31];break;case 'Z':--a[32];break;case 'B':--a[33];break;case 'F':--a[34];break;}}else switch(s[1]){case 'm':--a[s[0]-'0'];break;case 'p':--a[s[0]-'0'+9];break;case 's':--a[s[0]-'0'+18];break;}}while(true){cin>>s;if(s.size()==1){if(s[0]=='0')break;switch(s[0]){case 'E':b[28]=2;break;case 'S':b[29]=2;break;case 'W':b[30]=2;break;case 'N':b[31]=2;break;case 'Z':b[32]=2;break;case 'B':b[33]=2;break;case 'F':b[34]=2;break;}}else switch(s[1]){case 'm':b[s[0]-'0']=2;break;case 'p':b[s[0]-'0'+9]=2;break;case 's':b[s[0]-'0'+18]=2;break;}}ll ans=std::max(kokushimuso(),nanakumi());ckmax(ans,dp());cout<<ans<<"\n"; }return 0;
}

【GXOI/GZOI2019】宝牌一大堆(麻将DP)(贪心)相关推荐

  1. [GXOI/GZOI2019]宝牌一大堆(dp)

    luogu     bzoj 这个麻将题还算挺友善的,比隔壁zjoi的要好得多... 比较正常的做法是五维dp 但事实上六维dp也是完全不会被卡的 七对子选权值最高的七个,国士无双直接$13^2$暴力 ...

  2. [GXOI/GZOI2019]宝牌一大堆

    感觉比ZJOI的麻将要休闲很多啊. 这个题就是一个最优化问题,没有面子的特殊牌型可以直接用复杂度较低的贪心判掉. 有面子的话就是一个经典dp.(曾经还在ZJOI写过这个毒瘤东西 大概就是存一下对子,面 ...

  3. 题解 P5301 【[GXOI/GZOI2019]宝牌一大堆】

    这道题除了非常恶心以外也没有什么非常让人恶心的地方 当然一定要说有的话还是有的,就是这题和咱 ZJOI 的 mahjong 真的是好像的说~ 于是就想说这道题出题人应该被 锕 掉 noteskey 整 ...

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

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

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

    题面 传送门 题解 为什么又是麻将啊啊啊!而且还是我最讨厌的爆搜类\(dp\)-- 首先国士无双和七对子是可以直接搞掉的,关键是剩下的,可以看成\(1\)个雀头加\(4\)个杠子或面子 直接\(dp\ ...

  6. GXOI/GZOI2019题解

    GXOI/GZOI2019题解 P5300 [GXOI/GZOI2019]与或和 一眼题.. 显然枚举每个二进制位,答案就变成了全1子矩阵数量. 这个xjb推推,单调栈一下就行了. #include& ...

  7. P5303 [GXOI/GZOI2019]逼死强迫症 题解

    P5303 [GXOI/GZOI2019]逼死强迫症 P5303 [GXOI/GZOI2019]逼死强迫症 说实在的这题不难,但是我推 Dp\tt DpDp 的时候却只和正解相差一点,最后还是看了题解 ...

  8. [GXOI/GZOI2019]旧词——树链剖分+线段树

    题目链接: [GXOI/GZOI2019]旧词 对于$k=1$的情况,可以参见[LNOI2014]LCA,将询问离线然后从$1$号点开始对这个点到根的路径链修改,每次询问就是对询问点到根路径链查询即可 ...

  9. [数据结构专训][GXOI/GZOI2019]旧词,[hdu5118]GRE Words Once More!,[hdu6333]Problem B. Harvest of Apples

    文章目录 T1:[GXOI/GZOI2019]旧词 solution code T2:GRE Words Once More! solution code T3:Problem B. Harvest ...

最新文章

  1. 教授犀利致辞:躺平的韭菜不挨刀,但不挨刀的韭菜做不成佳肴
  2. deque python_3 . python Collections -- Deque Object
  3. 【机器学习实践】Jupyter Notebook安装 侧边导航栏功能 操作及其他常用扩展功能介绍...
  4. Javascript框架库漏洞验证
  5. excel中怎么把超链接的结果(图片)直接显示出来_把500张产品图片导入Excel里?用这个方法可超速完成,码住...
  6. 洛谷1056 排座椅 解题报告
  7. android触摸屏idc,android4.0触摸屏滑鼠模式解决方法-添加idc文件
  8. 简单的爬虫爬取教务网获取成绩
  9. Python实现Diffie-Hellman密钥交换协议
  10. python 服务端渲染_详解React 服务端渲染方案完美的解决方案
  11. Excel如何快速提取红色字体文本
  12. linux下编译geos,linux下编译GDAL3.x(集成Proj和Geos等)
  13. win10突然不能使用usb大容量存储设备(移动硬盘)的解决方法
  14. 2021最新 上海互联网公司排名
  15. python,用pycharm写的评分系统
  16. Speedpdf——无需下载软件,就可以免费轻松搞定CAJ转word
  17. cdc有哪些rapper_CDC说唱会馆在圈内是一个什么样的存在
  18. 有些事情,现在不想就晚了
  19. 连通图 P3387 缩点 模板
  20. Linux安装jdk,mysql,tomcat,redis和nginx

热门文章

  1. 【Aladdin-Unity3D-Shader编程】之八-2D图常用的Shader效果
  2. 工商银行支付接口 B2C PHP ecshop
  3. 爬虫入门经典(二十四) | 爬取当当网图书信息并进行数据清洗
  4. MPEG4标准中的Advanced Simple Profile(ASP)完整的说明-03-3章
  5. c语言虚位密码验证,智能锁的“虚位密码”是什么?该怎么用?
  6. 阿里巴巴Java代码规范
  7. 苹果CMSv10自适应视频站精品模板高端大气宽屏轮播幻灯模板
  8. android找回密码界面的代码,《Android项目实战-博学谷》设置密保找回密码
  9. 神经网络和深度学习1
  10. 弹性盒子模型属性之flex-grow