【BZOJ5503】[GXOI/GZOI2019]宝牌一大堆(动态规划)

题面

BZOJ

洛谷

题解

首先特殊牌型直接特判。

然后剩下的部分可以直接\(dp\),直接把所有可以存的全部带进去大力\(dp\)就行了。

发现每多一张牌胡的本质就是把一个刻字换成杠子,所以这两个东西记录在一起就行了。

那么状态就是\(f[i][0/1/2/3/4][0/1/2][0/1/2][0/1]\)

分别表示刻字、杠子、顺子的数量,\(i-1,i,i+1\)的顺子数量,\(i,i+1,i+2\)的顺子的数量,以及是否已经有对子。

转移比较容易。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstdlib>
  4. #include<cstring>
  5. #include<cmath>
  6. #include<algorithm>
  7. #include<vector>
  8. using namespace std;
  9. #define ll long long
  10. #define MAX 140
  11. int Read()
  12. {
  13. char ch[3];scanf("%s",ch);
  14. if(ch[0]=='E')return 28;if(ch[0]=='S')return 29;
  15. if(ch[0]=='W')return 30;if(ch[0]=='N')return 31;
  16. if(ch[0]=='Z')return 32;if(ch[0]=='B')return 33;
  17. if(ch[0]=='F')return 34;if(ch[0]=='0')return 0;
  18. int x=ch[0]-48;if(ch[1]=='p')x+=9;if(ch[1]=='s')x+=18;
  19. return x;
  20. }
  21. ll C[MAX][MAX];
  22. int n,s[MAX];bool book[MAX];
  23. ll f[35][6][3][3][2];
  24. int pre[14]={0,1,9,10,18,19,27,28,29,30,31,32,33,34};
  25. int bin[10]={1,2,4,8,16,32,64,128,256,512};
  26. void cmax(ll &x,ll y){x=max(x,y);}
  27. int main()
  28. {
  29. for(int i=0;i<10;++i)C[i][0]=1;
  30. for(int i=1;i<10;++i)
  31. for(int j=1;j<=i;++j)C[i][j]=C[i-1][j]+C[i-1][j-1];
  32. int T,x;scanf("%d",&T);
  33. while(T--)
  34. {
  35. for(int i=1;i<=34;++i)s[i]=4,book[i]=false;
  36. while((x=Read()))s[x]-=1;
  37. while((x=Read()))book[x]=true;
  38. ll ans=0;
  39. //Task1
  40. {
  41. bool fl=true;int mx=0;ll ret=1;
  42. for(int i=1;i<=13;++i)
  43. if(!s[pre[i]]){fl=false;break;}
  44. else mx=max(mx,(s[pre[i]]-1)*(book[pre[i]]?2:1)),ret=ret*(book[pre[i]]?2:1)*s[pre[i]];
  45. if(fl)ret=ret*mx*13/2,ans=max(ans,ret);
  46. }
  47. //Task2
  48. {
  49. vector<int> val;
  50. for(int i=1;i<=34;++i)
  51. if(s[i]>=2)val.push_back((book[i]?4:1)*(s[i]*(s[i]-1)/2));
  52. sort(val.begin(),val.end());
  53. if(val.size()>=7)
  54. {
  55. ll ret=1;
  56. for(int i=7;i;--i)ret*=val.back(),val.pop_back();
  57. ans=max(ans,ret*7);
  58. }
  59. }
  60. //Task3
  61. {
  62. memset(f,0,sizeof(f));
  63. f[0][0][0][0][0]=1;
  64. for(int i=1;i<=34;++i)
  65. for(int j=0;j<5;++j)
  66. for(int k=0;k<3&&j+k<=4&&k<=s[i];++k)
  67. {
  68. if(k>0&&(i==10||i==19||i>=28||i==11||i==20))break;
  69. for(int l=0;l<3&&j+k+l<=4&&k+l<=s[i];++l)
  70. {
  71. if(l>0&&(l==9||i==18||i==27||i==10||i==19||i>=28))break;
  72. if(!f[i-1][j][k][l][0]&&!f[i-1][j][k][l][1])continue;
  73. for(int m=0;k+l+m<=s[i]&&m<3;++m)
  74. {
  75. if(m>0&&(i==9||i==18||i>=27))continue;
  76. if(s[i]>=4+k+l+m)
  77. {
  78. cmax(f[i][j+1+k][l][m][0],(book[i]?16:1)*f[i-1][j][k][l][0]);
  79. cmax(f[i][j+1+k][l][m][1],(book[i]?16:1)*f[i-1][j][k][l][1]);
  80. }
  81. if(s[i]>=3+k+l+m)
  82. {
  83. cmax(f[i][j+1+k][l][m][0],(book[i]?bin[3+k+l+m]:1)*C[s[i]][3+k+l+m]*f[i-1][j][k][l][0]);
  84. cmax(f[i][j+1+k][l][m][1],(book[i]?bin[3+k+l+m]:1)*C[s[i]][3+k+l+m]*f[i-1][j][k][l][1]);
  85. }
  86. if(s[i]>=2+k+l+m)
  87. {
  88. cmax(f[i][j+k][l][m][1],(book[i]?bin[2+k+l+m]:1)*C[s[i]][2+k+l+m]*f[i-1][j][k][l][0]);
  89. }
  90. if(s[i]>=k+l+m)
  91. {
  92. cmax(f[i][j+k][l][m][0],(book[i]?bin[k+l+m]:1)*C[s[i]][k+l+m]*f[i-1][j][k][l][0]);
  93. cmax(f[i][j+k][l][m][1],(book[i]?bin[k+l+m]:1)*C[s[i]][k+l+m]*f[i-1][j][k][l][1]);
  94. }
  95. }
  96. }
  97. }
  98. ans=max(ans,f[34][4][0][0][1]);
  99. }
  100. printf("%lld\n",ans);
  101. }
  102. }

【BZOJ5503】[GXOI/GZOI2019]宝牌一大堆(动态规划)的更多相关文章

  1. [LOJ3084][GXOI/GZOI2019]宝牌一大堆——DP

    题目链接: [GXOI/GZOI2019]宝牌一大堆 求最大值容易想到$DP$,但如果将$7$种和牌都考虑进来的话,$DP$状态不好设,我们将比较特殊的七小对和国士无双单独求,其他的进行$DP$. 观 ...

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

    题目地址:P5301 [GXOI/GZOI2019]宝牌一大堆 这里是官方题解(by lydrainbowcat) 部分分 直接搜索可以得到暴力分,因为所有和牌方案一共只有一千万左右,稍微优化一下数据 ...

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

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

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

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

  5. luogu P5301 [GXOI/GZOI2019]宝牌一大堆

    传送门 wdnm又是打麻将 首先国土无双可以直接枚举哪种牌用了\(2\)次算贡献,然后\(7\)个对子可以把每种牌的对子贡献排序,取最大的\(7\)个,剩下的牌直接暴力枚举是不行的,考虑dp,设\(f ...

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

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

  7. [luogu 5301][bzoj 5503] [GXOI/GZOI2019] 宝牌一大堆

    题面 好像ZJOI也考了一道麻将, 这是要发扬中华民族的赌博传统吗??? 暴搜都不会打, 看到题目就自闭了, 考完出来之后看题解, \(dp\), 可惜自己想不出来... 对于国士无双(脑子中闪过了韩 ...

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

    原题传送门 首先先要学会麻将,然后会发现就是一个暴力dp,分三种情况考虑: 1.非七对子国士无双,设\(dp_{i,j,k,a,b}\)表示看到了第\(i\)种牌,一共有\(j\)个\(i-1\)开头 ...

  9. [GX/GZOI2019]宝牌一大堆(DP)

    出这种麻将题有意思吗? 乍看很难实则很水,就是麻将式DP,想必大家很熟悉了吧.首先把“国士无双”和“七对子”两种牌型判掉,然后观察牌胡的形式,发现每多一张牌实际上就是把1个面子变成1个杠子,然后可以直 ...

随机推荐

  1. Android网络图片转换成bitmap保存到本地指定文件夹

    下列代码,请求网络图片转换为bitmap,然后保存到指定文件夹,微信,QQ分享,要求缩略图不大于32kb 压缩图片代码,使用了Glide来进行图片压缩处理 Glide.get(ShopDetailsA ...

  2. elasticsearch常用命令

    elasticsearch的rest访问格式: curl -X<REST Verb> <Node>:<Port>/<Index>/<Type> ...

  3. 使用sqlyog或者navicat连接mysql提示1862错误解决

    mysql的bin目录下执行  mysqladmin -uroot -p password 依次输入旧密码.新密码.确认新密码 修改后重新使用sqlyog或navicat连接成功 问题解决!

  4. 【原】Java学习笔记004 - 运算符

    package cn.temptation; public class Sample01 { public static void main(String[] args) { // 运算符:对常量 或 ...

  5. mybatis配置文件说明(configuration)

    1. xml结构(可查看mybatis-3-config.dtd) <!ELEMENT configuration (properties?, settings?, typeAliases?, ...

  6. PyCharm使用小技巧

    本文部分内容参考了明宇李前辈的博客,原文请阅读 Pycharm的配置(背景颜色,字体,解释器等): 鼠标滑轮控制字体大小 部分参考了墨颜前辈的博客,原文请阅读 用鼠标滑轮控制代码字体大小: 感谢各位前 ...

  7. 我的第一个python web开发框架(28)——定制ORM(四)

    在数据库操作时,新增记录也是必不可少的,接下来我们应用字典的特性来组合sql语句 先上产品新增接口代码 @post('/api/product/') def callback(): "&qu ...

  8. Mac系统编译FFmpeg

    转载请标明来源:我不是掌柜的博客 前言 维基百科解释:FFmpeg是一个开源软件,可以运行音频和视频多种格式的录影.转换.流功能,包含了libavcodec – 这是一个用于多个项目中音频和视频的解码 ...

  9. CSS--字体|垂直居中|background

    一,字体的设置 二,垂直居中 2.1,单行文本垂直居中 2.2,多行文本垂直居中 2.3,绝对定位元素垂直居中 三.颜色的表示法 四.background ---------------------- ...

  10. spark推测执行的坑

    1.spark推测执行开启 设置 spark.speculation=true即可 2.spark开启推测执行的好处 推测执行是指对于一个Stage里面运行慢的Task,会在其他节点的Executor ...