AcWing 337. 扑克牌
大型补档计划
把状态实质相同的划分为一类...
发现花色、具体牌值的多少均不影响方案,考虑等效转化题目。
设 \(f[A][B][C][D][k]\) A 个 1 张相同,B 个 2 张相同,C 个 3张相同,D个 4张相同的牌,上一个放的牌现在有 \(k\) 张相同牌值的牌,排成的方案
状态转移就是考虑下一个放啥
\((true) = 1 (false) = 0;\)
考虑放 A 类
\(f[A - (k == 0)][B][C][D][0]\)
考虑放 B 类
\(2 * (B - (k == 1)) * f[A + 1][B - 1][C][D][1]\)
考虑放 C 类
\(3 * (C - (k == 2)) * f[A][B + 1][C - 1][C][D][2]\)
考虑放 D 类
\(4 * (D - (k == 3)) * f[A][B][C + 1][D - 1][C][D][3]\)
初始 \(f[0][0][0][0][k] = 1;\)
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
typedef unsigned long long LL;
const int N = 14;
LL f[N][N][N][N][5];
int n, cnt[N], tot[5];
LL dp(int A, int B, int C, int D, int k) {
if (f[A][B][C][D][k]) return f[A][B][C][D][k];
if (!A && !B && !C && !D) return 1;
LL &v = f[A][B][C][D][k] = 0;
if (A) v += (A - (k == 1)) * dp(A - 1, B, C, D, 0);
if (B) v += 2 * (B - (k == 2)) * dp(A + 1, B - 1, C, D, 1);
if (C) v += 3 * (C - (k == 3)) * dp(A, B + 1, C - 1, D, 2);
if (D) v += 4 * (D - (k == 4)) * dp(A, B, C + 1, D - 1, 3);
return v;
}
int inline get(char c) {
if (c == 'T') return 10;
else if(c == 'J') return 11;
else if(c == 'Q') return 12;
else if(c == 'K') return 13;
else if(c == 'A') return 1;
else return c - '0';
}
int main() {
int T; scanf("%d", &T);
for (int Case = 1; Case <= T; Case++) {
memset(cnt, 0, sizeof cnt);
tot[0] = tot[1] = tot[2] = tot[3] = tot[4] = 0;
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
char s[3]; scanf("%s", s);
cnt[get(s[0])]++;
}
for (int i = 1; i <= 13; i++) tot[cnt[i]]++;
printf("Case #%d: %llu\n", Case, dp(tot[1], tot[2], tot[3], tot[4], 0));
}
return 0;
}
AcWing 337. 扑克牌的更多相关文章
- acwing 81. 扑克牌的顺子
地址 https://www.acwing.com/problem/content/77/ 从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的. 2-10为数字本身,A为1,J为11, ...
- WPF扑克牌之红桃K
原文:WPF扑克牌之红桃K 有些什么用途呢?我想,如果你有兴趣,可用来制作WPF扑克牌游戏. 没有任何技术含量,需要做的是在Blend中绘图或者使用Illustrator,CoreDraw等矢图设计软 ...
- SCNU 2015ACM新生赛初赛【1007. ZLM的扑克牌】解题报告
题目链接详见SCNU 2015新生网络赛 1007. ZLM的扑克牌 . 其实我在想这题的时候,还想过要不要设置求最小的排列,并且对于回文数字的话,可以把扑克牌折起来( ...
- Java 用LinkdeList实现52张扑克牌
用LinkdeList实现52张扑克牌(不含大小王)的洗牌功能.提示:花色 ,和数字分别用数组存储. import java.util.LinkedList; import java.util.Ran ...
- C算法编程题(一)扑克牌发牌
前言 上周写<我的编程开始(C)>这篇文章的时候,说过有时间的话会写些算法编程的题目,可能是这两天周末过的太舒适了,忘记写了.下班了,还没回去,闲来无事就写下吧. 因为写C++的编程题和其 ...
- JAVA collection集合之 扑克牌游戏
主要内容:这里使用collection集合,模拟香港电影中大佬们玩的扑克牌游戏. 1.游戏规则:两个玩家每人手中发两张牌,进行比较.比较每个玩家手中牌最大的点数,大小由A-2,点数大者获胜.如果点数相 ...
- Java程序设计之扑克牌
这段代码的主要实现功能扑克牌的洗牌和发牌功能,一副牌,红桃,黑桃,梅花,方片,A~K,不含大小王. 构造一个class. 首先是声明花色: private String[] sign={"方 ...
- js运动框架之掉落的扑克牌(重心、弹起效果)
玩过电脑自带纸牌游戏的同志们应该都知道,游戏过关后扑克牌会依次从上空掉落,落下后又弹起,直至"滚出"屏幕. 效果如图: 这个案例的具体效果就是:点击开始运动,纸牌会从右上角掉 ...
- javascript练习-扑克牌
下面用枚举类型来实现一副扑克牌的类: //定义一个玩牌的类 function Card(suit,rank){ function inherit(p){ if(p==null) throw TypeE ...
随机推荐
- 极客mysql06
两阶段锁:在 InnoDB 事务中,行锁是在需要的时候才加上的,但并不是不需要了就立刻释放, 而是要等到事务结束时才释放. 建议:如果你的事务中需要锁多个行,要把最可能造成锁冲突.最可能影响并发度的锁 ...
- 钉钉自定义机器人webhook
这篇博文主要讲的是如何进行自定义定时发送一些text类的消息的自定义机器人.添加过程不细讲了. 首先我们需要拿到一个Hook地址,就是你在添加自定义机器人的时候有个,如图: 然后开始编写我们的脚本,我 ...
- HotSpot类模型之InstanceKlass
上一篇 HotSpot源码分析之类模型 介绍了类模型的基础类Klass的重要属性及方法,这一篇介绍一下InstanceKlass及InstanceKlass的子类. 1.InstanceKlass类 ...
- 解决 Mac webstrom Mac bigsur 中 Can‘t use Subversion command line client:svn
解决 Mac webstrom Can't use Subversion command line client: svn The path to the Subversion executable ...
- [LeetCode题解]876. 链表的中间结点 | 快慢指针
解题思路 使用快慢指针.这里要注意的是,while 的条件会影响当中间节点有两个时,slow 指向的是第一个,还是第二个节点. // 返回的是第一个 while(fast.next != null & ...
- Java(6)集合
一.Java集合框架概述 1.什么是集合 集合框架:用于存储数据的容器. 数组.集合等存储数据的结构,叫Java容器. 此时的存储,是指内存层面的存储,不涉及持久化的存储. 任何集合框架都包含三大块的 ...
- 各种有趣vbs,bat脚本
短信轰炸.vbs Dim btn,ie Set ie = WScript.CreateObject("InternetExplorer.Application") ie.Visib ...
- 重闯Sqli-labs关卡第三天(11-15关)
前言 今天早上学了学网易云课堂的注入课程突然感觉网易云可i春秋联合出品的课程还不错,之后就刷了刷攻防世界的题,题有眉目但是还是忍不住看了WP 服了自己了!!!一直刷到了晚上也不知道几点我妈买了柚子回了 ...
- SAP PI接口ESR IA配置,几种常用的 XSL 转换文档模板
在PI开发配置中字段映射一般分为Message Mapping(MM)和Imported Archives(IA)这两种形式.MM这种拉线的形式虽然看似方便,但是当接口更新和传输时往往比较麻烦,同时无 ...
- Guitar Pro 7教程之如何导入吉他谱
在前面的章节小编为大家也讲解了不少关于Guitar Pro 的相关教程,譬如{cms_selflink page='index' text='Guitar Pro下载'},安装等等一系列的使用教程,前 ...