luogu     bzoj

这个麻将题还算挺友善的,比隔壁zjoi的要好得多。。。

比较正常的做法是五维dp

但事实上六维dp也是完全不会被卡的

七对子选权值最高的七个,国士无双直接$13^2$暴力

$dp[i][j][0/1][k][l][m]$表示枚举到了第i张牌,已经凑了j个面子,有无雀头,第i张牌已经用了k张,第i+1张牌用了l张,第i+2张牌用了m张,直接暴力转移。。。

然后你会得到50...

当然需要优化。

优化1:

枚举到dp值为0的直接continue,这样的不合法牌型有很多可以直接跳过。

优化2:

l和m只枚举到2,原因?如果枚举到三个顺子的话那么我们完全可以用三个刻子等效替代。

优化3:

不需要考虑杠。

原因?

$C_{4}^{3}=4$,$C_{4}^{4}=1$

就算这张牌是宝牌选刻子也必然优于杠子

代码就领略一下精神吧(

 #include<cstdio>
 #include<algorithm>
 #include<queue>
 #define d01(x) for(int x=0;x<2;x++)
 using std::priority_queue;
 using std::max;
 typedef long long lint;
 ];
 void dm(lint &kk,lint l){kk=max(kk,l);}

 ],dora[];//1~9,10~18,19~27,28,29,30,31,32,33,34
 lint dp[][][][][][];
 lint dg[];
 lint ans;
 ][]={
     ,,,,,
     ,,,,,
     ,,,,,
     ,,,,,
     ,,,,
 };
 ]={,,,,,,,,,,,,,};
 ]={,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,};
 ]={,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,};
 void kokushi()
 {
     int x;
     ;i<=;i++)
     {
         x=yaoku[i];
         lint tmp=;
         tmp*=c[a[x]][]*dora[x]*dora[x];
         ;j<=;j++)
         {
             if(i==j) continue;x=yaoku[j];
             tmp*=a[x]*dora[x];
         }
         ans=max(ans,tmp);
     }
 }
 priority_queue<int> q;
 void chitoi()
 {
     lint tmp=;
     ;i<=;i++) q.push(c[a[i]][]*dora[i]*dora[i]);
     int g;
     ;i<=;i++)
     {
         g=q.top();
         q.pop();
         tmp*=g;
     }
     ans=max(ans,tmp);
     while(!q.empty()) q.pop();
 }

 void clr()
 {
     ;i<=;i++)
     {
         dg[i]=;
         ;j<=;j++)
         {
             ;k<=;k++)
             {
                 ;l<=;l++)
                 {
                     ;m<=;m++)
                     dp[i][j][][k][l][m]=dp[i][j][][k][l][m]=;
                 }
             }
         }
     }
     ;i<=;i++) a[i]=,dora[i]=;
     ans=;
     dp[][][][][][]=;
 }
 int main()
 {
     int T;
     scanf("%d",&T);
     while(T--)
     {
         clr();
         )
         {
             scanf("%s",si);
             ]==') break;
             ]==]-']--;
             ]==]-]--;
             ]==]-]--;
             ]==]--;
             ]==]--;
             ]==]--;
             ]==]--;
             ]==]--;
             ]==]--;
             ]==]--;
         }
         )
         {
             scanf("%s",si);
             ]==') break;
             ]==]-;
             ]==]-]=;
             ]==]-]=;
             ]==]=;
             ]==]=;
             ]==]=;
             ]==]=;
             ]==]=;
             ]==]=;
             ]==]=;
         }
         kokushi();//国士无双
         chitoi();//七对子
         ;i<=;i++)
         {
             ;j<=;j++)
             {
                 ;k<=;k++)
                 {
                     ;l<=;l++)
                     {
                         ;m<=;m++)
                         {
                             ][k][l][m]&&!dp[i][j][][k][l][m]) continue;
                             ) dm(dp[i][j][][k+][l][m],dp[i][j][][k][l][m]/c[a[i]][k]*c[a[i]][k+]*dora[i]*dora[i]);
                             //雀头
                             )
                             {
                                 ) d01(o) dm(dp[i][j+][o][k+][l][m],dp[i][j][o][k][l][m]/c[a[i]][k]*c[a[i]][k+]*dora[i]*dora[i]*dora[i]);
                                 //刻子
                                 &&a[i+]-l>&&a[i+]-m>&&l!=&&m!=)
                                     d01(o) dm(dp[i][j+][o][k+][l+][m+],dp[i][j][o][k][l][m]/c[a[i]][k]*c[a[i]][k+]*dora[i]/c[a[i+]][l]*c[a[i+]][l+]*dora[i+]/c[a[i+]][m]*c[a[i+]][m+]*dora[i+]);
                                 //顺子
                             }
                             dm(dp[i+][j][][l][m][],dp[i][j][][k][l][m]);
                             dm(dp[i+][j][][l][m][],dp[i][j][][k][l][m]);
                             //转移
                             ) dg[i]=max(dg[i],dp[i][j][][k][l][m]);
                         }
                     }
                 }
             }
         }
         ;i<=;i++) ans=max(ans,dg[i]);
         printf("%lld\n",ans);
     }
     ;
 }

Orz

[GXOI/GZOI2019]宝牌一大堆(dp)的更多相关文章

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

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

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

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

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

    [BZOJ5503][GXOI/GZOI2019]宝牌一大堆(动态规划) 题面 BZOJ 洛谷 题解 首先特殊牌型直接特判. 然后剩下的部分可以直接\(dp\),直接把所有可以存的全部带进去大力\(d ...

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

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

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

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

  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. webpack 4.0 相关

    Webpack 4.0发布了!! https://www.jianshu.com/p/3a13f1b37300 webpack详解 https://juejin.im/post/5aa3d2056fb ...

  2. UVa 12712 && UVaLive 6653 Pattern Locker (排列组合)

    题意:给定 一个n * n 的宫格,就是图案解锁,然后问你在区间 [l, r] 内的所有的个数进行组合,有多少种. 析:本来以为是数位DP,后来仔细一想是排列组合,因为怎么组合都行,不用考虑实际要考虑 ...

  3. Ubuntu 14.04.1 配置 Android 源码开发环境(jdk版本切换)(转载)

    转自:http://www.cnblogs.com/ren-gh/p/4248407.html # Ubuntu 14.04.1 1.更新源: sudo apt-get update 安装vim工具: ...

  4. eclipse本地怎么和git相同

    1.打开Eclipse后,在左侧的项目窗口空白处右键,选择“Import...”2.打开Import窗口后,选择“Git”->"Projects from Git",点击“N ...

  5. NOIp 2017 奶酪 【并查集】 By cellur925

    题目传送门 Orz去年考场上做这道题的我应该还在抱怨没学过空间几何,不一会太困了就开始打瞌睡,然后为了防止睡觉开始在devc++上写默写离骚(逃 思路:如果两个空洞相交,那么把他们并在一个集合里.最后 ...

  6. bind: Invalid argument

    出现此问题在于,listen函数在socket函数和bind函数之间. 例: /*客户端程序开始建立sockfd描述符*/ listenfd = socket(AF_INET,SOCK_STREAM, ...

  7. dllMain函数

    Windows在加载DLL的时候,需要一个入口函数,就如同控制台或DOS程序需要main函数.Win32程序需要WinMain函数一样.一些例子中,DLL并没有提供DllMain函数,应用工程也能成功 ...

  8. BZOJ2159 Crash的文明世界

    Description 传送门 给你一个n个点的树,边权为1. 对于每个点u, 求:\(\sum_{i = 1}^{n} distance(u, i)^{k}\) $ n \leq 50000, k ...

  9. hdu 4565 So Easy! (共轭构造+矩阵快速幂)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4565 题目大意: 给出a,b,n,m,求出的值, 解题思路: 因为题目中出现了开根号,和向上取整后求 ...

  10. 递归查找无效的符号链接 分类: linux c/c++ 2014-06-02 00:14 345人阅读 评论(0) 收藏

    本程序实现在指定目录下递归查找无效的符号链接. 1.设计思路 逐个读取给定目录中的目录项,判断类型 (1)若为目录,则读取该目录中的目录项并判断类型: (2)若为链接文件,则读取出其指向文件的名称(绝 ...