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

这道题除了非常恶心以外也没有什么非常让人恶心的地方

当然一定要说有的话还是有的,就是这题和咱 ZJOI 的 mahjong 真的是好像的说~

于是就想说这道题出题人应该被 锕 掉

noteskey

整体的思路就是特判国士无双和七对子,然后 dp 搞普通的胡牌

dp 状态设计和楼上大佬说的一样,就是用一个五维的 \(f[i][j][k][l][p]\) 表示当前处理了前 i 种类型的牌,存在 j 个 面子/杠子 ,以 i-1 开头的顺子要选 k 个,以 i 开头的面子要选 l 个,以及当前是否有 雀头 (用 p 表示)

然后转移就非常的暴力了,反正这里的数据范围也比较小,枚举下状态转移就好了

总的来说就是道 语文 + 码农 + dp 题,虽说没什么思维难度但我不见得能想出来

watch out

这题的字符串读入还是比较毒瘤的...要稍微注意一下不然可能会出事

code

这压行是同样的味道呢~

//by Judge
#include<bits/stdc++.h>
#define Rg register
#define fp(i,a,b) for(Rg int i=(a),I=(b)+1;i<I;++i)
#define ll long long
using namespace std;
#ifndef Judge
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
#endif
char buf[1<<21],*p1=buf,*p2=buf;
inline bool cmax(ll& a,ll b){return a<b?a=b,1:0;}
inline int read(){ int x=0,f=1; char c=getchar();for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;for(;isdigit(c);c=getchar()) x=x*10+c-'0'; return x*f;
} inline void reads(string& s){ char c=getchar();for(;!isalpha(c)&&!isdigit(c);c=getchar()); s="";for(;isalpha(c)||isdigit(c);c=getchar()) s+=c;
} char sr[1<<21],z[20];int CCF=-1,Z;
inline void Ot(){fwrite(sr,1,CCF+1,stdout),CCF=-1;}
inline void print(ll x,char chr='\n'){if(CCF>1<<20)Ot();if(x<0)sr[++CCF]=45,x=-x;while(z[++Z]=x%10+48,x/=10);while(sr[++CCF]=z[Z],--Z);sr[++CCF]=chr;
} int t,cnt,a[41],b[41],C[5][5]; ll f[41][5][3][3][2],tp[41];
int gs[14]={0,1,9,10,18,19,27,28,29,30,31,32,33,34}; string c;
inline int id(){ if(c[0]=='B') return 34;if(c[0]=='E') return 28; if(c[0]=='S') return 29; if(c[0]=='W') return 30;if(c[0]=='N') return 31; if(c[0]=='Z') return 32; if(c[0]=='F') return 33;if(c[1]=='m') return c[0]-48; if(c[1]=='p') return c[0]-39; return c[0]-30;
}
int main(){ C[0][0]=1;fp(i,1,4){ C[i][0]=1;fp(j,1,i) C[i][j]=C[i-1][j-1]+C[i-1][j];}fp(T,1,read()){memset(a,0,sizeof a);memset(b,0,sizeof b);memset(f,0,sizeof f);while(1){ reads(c);if(c[0]=='0') break;else ++a[id()];}while(1){ reads(c);if(c[0]=='0') break;else b[id()]=1;}fp(i,1,34) a[i]=4-a[i];ll ans=0;fp(i,1,13){ ll tmp=1; //枚举出现两次的牌 fp(j,1,13) //枚举 13 种牌 if(i==j)if(a[gs[j]]<2) tmp=0; //如果数量不够就让 tmp=0 else tmp*=C[a[gs[j]]][2]*(b[gs[j]]?4:1); //否则加贡献 elseif(a[gs[j]]<1) tmp=0;else tmp*=C[a[gs[j]]][1]*(b[gs[j]]?2:1);cmax(ans,tmp*13);}cnt=0;fp(i,1,34) if(a[i]>=2) tp[++cnt]=C[a[i]][2]*(b[i]?4:1);if(cnt>=7){ //如果牌数大于等于 2 的不止 7 张就可以构成七对子 sort(tp+1,tp+1+cnt); ll tmp=1; //选出权最大的 7 种牌 fp(i,cnt-6,cnt) tmp*=tp[i]; //累乘贡献 cmax(ans,tmp*7);}f[0][0][0][0][0]=1; //初始化边界 fp(i,0,33) fp(j,0,4) for(Rg int k=0;k<3&&j+k<=4;++k){if(k>=1&&(i==9||i==18||i>=27)) break; //不合法开头无法构成顺子 for(Rg int l=0;l<3&&j+k+l<=4;++l){if(l>=1&&(i==9||i==18||i==27)) break;if(f[i][j][k][l][0]||f[i][j][k][l][1]) fp(u,k+l,a[i+1]){ll tmp=C[a[i+1]][u]*(b[i+1]?(1<<u):1); //计算贡献 // 四种转移 if(j+u<=4&&u-k-l<3) cmax(f[i+1][j+k][l][u-k-l][0],f[i][j][k][l][0]*tmp),cmax(f[i+1][j+k][l][u-k-l][1],f[i][j][k][l][1]*tmp);if(u-k-l-2>=0&&j+u-2<=4)cmax(f[i+1][j+k][l][u-k-l-2][1],f[i][j][k][l][0]*tmp);if(u-k-l-3>=0&&j+u-2<=4)cmax(f[i+1][j+k+1][l][u-k-l-3][0],f[i][j][k][l][0]*tmp),cmax(f[i+1][j+k+1][l][u-k-l-3][1],f[i][j][k][l][1]*tmp);if(u==4&&!k&&!l&&j<=3)cmax(f[i+1][j+1][0][0][0],f[i][j][k][l][0]*tmp),cmax(f[i+1][j+1][0][0][1],f[i][j][k][l][1]*tmp);}}}cmax(ans,f[34][4][0][0][1]),print(ans);} return Ot(),0;
}

转载于:https://www.cnblogs.com/Judge/p/10749200.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/424996.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣:组合总和 II DFS剪枝

组合总和 II 给定一个数组 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用一次。 说明&#xff1a; 所有数字&#xff08;包括目标数&#xff09;都是正整数。 解集不能包…

[Leetcode][第336题][JAVA][回文对][暴力][HashSet][字典树]

【问题描述】[困难] 【解答思路】 1. 暴力&#xff08;超时&#xff09; 时间复杂度&#xff1a;O(n 2 m)&#xff0c;其中 n 是字符串的数量&#xff0c;m 是字符串的平均长度 空间复杂度&#xff1a;O(1) class Solution {public List<List<Integer>> palindr…

第十二期:面试官问你什么是消息队列?把这篇甩给他!

消息队列不知道大家看到这个词的时候&#xff0c;会不会觉得它是一个比较高端的技术&#xff0c;反正我是觉得它好像是挺牛逼的。 一、什么是消息队列&#xff1f; 消息队列不知道大家看到这个词的时候&#xff0c;会不会觉得它是一个比较高端的技术&#xff0c;反正我是觉得它…

第三章 随机变量的数字特征

数学期望 数学期望用来反映平均情况。 定义 设离散型随机变量X的分布律为P(Xxk)pk,k1,2,3...&#xff0c;若级数∑∞k1xkpk是收敛的&#xff0c;则称级数∑∞k1xkpk的值为随机变量X的数学期望。记为E(X)。E(X)∑k1∞xkpkpk可以理解为加权平均中的权值。数学期望又称为 均值。 …

python二进制、字符编码及文件操作

1. 二进制 bin()十进制转二进制 0b oct&#xff08;&#xff09;十进制转八进制 0o hex&#xff08;&#xff09;十进制转十六进制 0x&#xff0c;4个二进制对应1个16进制&#xff0c;用于网络编程&#xff0c;数据存储 print(int(110111,2)) 55 print(int(ffff,16)) 65535 p…

【数据结构与算法】【字符串匹配】Trie树

单模式串匹配 BF 算法和 RK 算法 BM 算法和 KMP 算法多模式串匹配算法 Trie 树和 AC 自动机 一、 什么是“Trie树”&#xff1f; 1. 他是一种树形结构&#xff0c;是一种专门处理字符串匹配的数据结构&#xff0c;解决在一组字符串集合中快速查找某个字符串的问题。 2. Trie…

第十三期:消灭 Java 代码的“坏味道”

代码中的"坏味道"&#xff0c;如"私欲"如"灰尘"&#xff0c;每天都在增加&#xff0c;一日不去清除&#xff0c;便会越累越多。如果用功去清除这些"坏味道"&#xff0c;不仅能提高自己的编码水平&#xff0c;也能使代码变得"精白…

力扣 两数相加 指针操作注意事项

两数相加 给出两个 非空 的链表用来表示两个非负的整数。其中&#xff0c;它们各自的位数是按照 逆序 的方式存储的&#xff0c;并且它们的每个节点只能存储 一位 数字。 如果&#xff0c;我们将这两个数相加起来&#xff0c;则会返回一个新的链表来表示它们的和。 您可以假设…

[Leetcode][第100题][JAVA][相同的树][二叉树][深度遍历][递归]

【问题描述】[中等] 【解答思路】 深度遍历/递归 终止条件与返回值&#xff1a; 当两棵树的当前节点都为 null 时返回 true 当其中一个为 null 另一个不为 null 时返回 false 当两个都不为空但是值不相等时&#xff0c;返回 false 执行过程&#xff1a;当满足终止条件时进…

Java_多态

定义&#xff1a; 所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定&#xff0c;而是在程序运行期间才确定&#xff0c;即一个引用变量到底会指向哪个类的实例对象&#xff0c;该引用变量发出的方法调用到底是哪个类中实现的…

第十四期:5 个 JS 不良编码习惯,你占几个呢?

在阅读JavaScript代码时&#xff0c;你是否有过这种感觉&#xff1a;你几乎不明白代码的作用&#xff1f;代码使用了很多 JavaScript 技巧&#xff1f;命名和编码风格太过随意&#xff1f; 这些都是不良编码习惯的征兆。 在阅读JavaScript代码时&#xff0c;你是否有过这种感觉…

力扣3. 无重复字符的最长子串 two pointer算法|滑动窗口|尺取法

无重复字符的最长子串 给定一个字符串&#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”&#xff0c;所以其长度为 3。 示例 2: 输入: “bbbbb” 输出: 1 解释: 因为无重复字符的最…

318. Maximum Product of Word Lengths

问题&#xff1a;给定一个字符串数组words&#xff0c;找到这样的最大值&#xff1a;length(word[i]) * length(word[j])&#xff0c;words[i]和words[j]没有共同的字母。假设输入字符串只包含小写字母。如果不存在这样的两个字符串&#xff0c;则返回0。 思路&#xff1a;难点…

第十五期:详解Java集合框架,让你全面掌握!

一、Java集合框架概述 集合可以看作是一种容器&#xff0c;用来存储对象信息。所有集合类都位于java.util包下&#xff0c;但支持多线程的集合类位于java.util.concurrent包下。 数组与集合的区别如下&#xff1a; 1&#xff09;数组长度不可变化而且无法保存具有映射关系的…

[Leetcode][第98 450 700 701题][JAVA][二叉搜索树的合法性、增、删、查][递归][深度遍历]

【二叉搜索树定义】&#xff08;BST&#xff09; 二叉搜索树&#xff08;Binary Search Tree&#xff0c;简称 BST&#xff09;是一种很常用的的二叉树。它的定义是&#xff1a;一个二叉树中&#xff0c;任意节点的值要大于等于左子树所有节点的值&#xff0c;且要小于等于右边…

关于CNN的权重共享,CNN到底学到了什么?

CNN的fliter里的每个值都是学习出来的不是事先设定好的。 经过fliter处理后得到是特征图(feature map) 卷积减少权重参数的本质&#xff1a; 权重共享&#xff0c;不同的fliter会在某些神经元上权重共享。 到底fliter&#xff0c;到底CNN学到了什么&#xff1f; 底层的flite…

复盘二进制的习题(1)

本文是对近期二进制专题的leetcde习题的复盘。文中的解决思路来源于leetcode的讨论&#xff0c;以及一些网页。 342 判断一个整数(32bits)是否是4的次幂。  写出4i,i0,1,2,3,4...的二进制表示&#xff0c;查找规律。会发现这些数的特征是 a 都>0&#xff1b;b 只有一位是…

第十六期:简单的介绍一下大数据中最重要的MapReduce

MapReduce是分布式运行的&#xff0c;由两个阶段组成&#xff1a;Map和Reduce&#xff0c;Map阶段是一个独立的程序&#xff0c;有很多个节点同时运行&#xff0c;每个节点处理一部分数据。 MapReduce执行流程图 概述 MapReduce是一种分布式计算模型&#xff0c;由Google提出…

【perl】simpleHTTP

【perl】simpleHTTP 类似Python SimpleHTTPServer #!/usr/bin/perl # https://metacpan.org/pod/HTTP::Server::Simple # https://metacpan.org/pod/distribution/CGI/lib/CGI.pod package WebServer;use strict; use warnings FATAL > all; use HTTP::Server::Simple::CGI;…

【数据结构与算法】快排、归并 O(nlogn) 基于比较

冒泡、插入、选择 O(n^2) 基于比较 快排、归并 O(nlogn) 基于比较 计数、基数、桶 O(n) 不基于比较 一、分治思想 1.分治思想&#xff1a;分治&#xff0c;顾明思意&#xff0c;就是分而治之&#xff0c;将一个大问题分解成小的子问题来解决&#xff0c;小的子问题解决了&…