[GXOI/GZOI2019]宝牌一大堆(dp)
这个麻将题还算挺友善的,比隔壁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)的更多相关文章
- [LOJ3084][GXOI/GZOI2019]宝牌一大堆——DP
题目链接: [GXOI/GZOI2019]宝牌一大堆 求最大值容易想到$DP$,但如果将$7$种和牌都考虑进来的话,$DP$状态不好设,我们将比较特殊的七小对和国士无双单独求,其他的进行$DP$. 观 ...
- P5301 [GXOI/GZOI2019]宝牌一大堆
题目地址:P5301 [GXOI/GZOI2019]宝牌一大堆 这里是官方题解(by lydrainbowcat) 部分分 直接搜索可以得到暴力分,因为所有和牌方案一共只有一千万左右,稍微优化一下数据 ...
- 【BZOJ5503】[GXOI/GZOI2019]宝牌一大堆(动态规划)
[BZOJ5503][GXOI/GZOI2019]宝牌一大堆(动态规划) 题面 BZOJ 洛谷 题解 首先特殊牌型直接特判. 然后剩下的部分可以直接\(dp\),直接把所有可以存的全部带进去大力\(d ...
- luogu P5301 [GXOI/GZOI2019]宝牌一大堆
传送门 wdnm又是打麻将 首先国土无双可以直接枚举哪种牌用了\(2\)次算贡献,然后\(7\)个对子可以把每种牌的对子贡献排序,取最大的\(7\)个,剩下的牌直接暴力枚举是不行的,考虑dp,设\(f ...
- 题解 P5301 【[GXOI/GZOI2019]宝牌一大堆】
这道题除了非常恶心以外也没有什么非常让人恶心的地方 当然一定要说有的话还是有的,就是这题和咱 ZJOI 的 mahjong 真的是好像的说~ 于是就想说这道题出题人应该被 锕 掉 noteskey 整 ...
- [GXOI/GZOI2019]宝牌一大堆
感觉比ZJOI的麻将要休闲很多啊. 这个题就是一个最优化问题,没有面子的特殊牌型可以直接用复杂度较低的贪心判掉. 有面子的话就是一个经典dp.(曾经还在ZJOI写过这个毒瘤东西 大概就是存一下对子,面 ...
- [luogu 5301][bzoj 5503] [GXOI/GZOI2019] 宝牌一大堆
题面 好像ZJOI也考了一道麻将, 这是要发扬中华民族的赌博传统吗??? 暴搜都不会打, 看到题目就自闭了, 考完出来之后看题解, \(dp\), 可惜自己想不出来... 对于国士无双(脑子中闪过了韩 ...
- 【题解】Luogu P5301 [GXOI/GZOI2019]宝牌一大堆
原题传送门 首先先要学会麻将,然后会发现就是一个暴力dp,分三种情况考虑: 1.非七对子国士无双,设\(dp_{i,j,k,a,b}\)表示看到了第\(i\)种牌,一共有\(j\)个\(i-1\)开头 ...
- [GX/GZOI2019]宝牌一大堆(DP)
出这种麻将题有意思吗? 乍看很难实则很水,就是麻将式DP,想必大家很熟悉了吧.首先把“国士无双”和“七对子”两种牌型判掉,然后观察牌胡的形式,发现每多一张牌实际上就是把1个面子变成1个杠子,然后可以直 ...
随机推荐
- Linux基本命令—mkfs/mount/umount/wget/yes/make/passwd
mkfs:用来在特定的分区建立Linux文件系统,是make filesystem的缩写. 例子:mkfs .ext3 /dev/mmcblk0p1 //把该设备格式化成ext3文件系统 m ...
- 《windows核心编程系列》二十一谈谈基址重定位和模块绑定
每个DLL和可执行文件都有一个首选基地址.它表示该模块被映射到进程地址空间时最佳的内存地址.在构建可执行文件时,默认情况下链接器会将它的首选基地址设为0x400000.对于DLL来说,链接器会将它的首 ...
- python网络爬虫之三re正则表达式模块
""" re正则表达式,正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的 一些特定字符,及这些特定字符的组合,组成一个"规则字符串",然后用 ...
- java启动参数二
非标准参数又称为扩展参数,其列表如下: -Xint 设置jvm以解释模式运行,所有的字节码将被直接执行,而不会编译成本地码. -Xbatch 关闭后台代码编译,强制在前台编译,编译完成之后才能进行代码 ...
- [Usaco2017 Feb]Why Did the Cow Cross the Road I (Gold)
Description 有一幅n*n的方格图,n <=100,每个点上有一个值. 从(1,1)出发,走到(n,n),只能走上下左右. 每走一步花费t,每走三步需要花费走完三步后到达格子的值. 求 ...
- bzoj2002 [Hnoi2010]Bounce 弹飞绵羊【LCT】
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2002 第一道LCT,调了3天,发现是智障bug,我的青春... 主要参考了黄学长的代码,也没 ...
- AC自动机 HDOJ 2222 Keywords Search
题目链接 题意:每个文本串的出现次数 分析:入门题,注意重复的关键字算不同的关键字,还有之前加过的清零. 新模板,加上last跑快一倍 #include <bits/stdc++.h> ...
- CalService
package org.crazyit.cal; import java.math.BigDecimal; /** * 计算业务类 * * @author yangenxiong yangenxion ...
- Windows 7操作系统下PHP 7的安装与配置(图文详解)
前提博客 Windows 7操作系统下Apache的安装与配置(图文详解) 从官网下载 PHP的官网 http://www.php.net/ 特意,新建这么一个目录 ...
- poj1715Hexadecimal Numbers(数位dp)
链接 好久没写这种逐位计数的了. 先统计出总的数 ,s-n+1,倒着计算的 ,感觉倒着比较符合计算方式,总数为15*A(15,i) (1=<i<=8) 也就是1-8长度所有的排列总数 然后 ...