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 ...
随机推荐
- 怎样禁止Ceph OSD的自动挂载
前言 本篇来源于群里一个人的问题,有没有办法让ceph的磁盘不自动挂载,一般人的问题都是怎样让ceph能够自动挂载,在centos 7 平台下 ceph jewel版本以后都是有自动挂载的处理的,这个 ...
- parted分区对齐
分区提示未对齐 [root@lab8106 ceph]# parted /dev/sdd GNU Parted 3.1 Using /dev/sdd Welcome to GNU Parted! Ty ...
- Vue-router插件使用
单页面原理 Vue是单页面开发,即页面不刷新. 页面不刷新,而又要根据用户选择完成内容的更新该怎么做?Vue中采用锚点来完成. 如访问http://127.0.0.1#/index就是主页,而访问ht ...
- [从源码学设计]蚂蚁金服SOFARegistry之网络封装和操作
[从源码学设计]蚂蚁金服SOFARegistry之网络封装和操作 目录 [从源码学设计]蚂蚁金服SOFARegistry之网络封装和操作 0x00 摘要 0x01 业务领域 1.1 SOFARegis ...
- 怎么在word里编辑插入数学公式?
大学时代我们都有一个共同的噩梦--高数.每次上完高数课都有一些数学公式.可是我们最难的就是想用电脑在word中做笔记的时候该怎样用word插入公式.Word中自有的公式太少,新公式又太难输入.这也是一 ...
- guitar pro系列教程(九):Guitar Pro音谱“编辑”讲解
对广大音乐人来说,guitar pro不只是一款看谱软件,更是制谱辅助创作的好搭档 打开guitar pro创作软件的 主界面,你会看到"编辑"的字样,单击一下,会弹出下面的界面, ...
- Boom 3D的保真度是什么,如何应用
Boom 3D是一款非常优秀的3D音频软件,拥有3D音效.环境模式.空间模式.夜间模式.保真度等多种音效模式,可以为用户提供多种音效体验感. 第一.什么是保真度 或许第一次接触音频软件的朋友就会问到什 ...
- Codeforces Round #631 (Div. 1) B. Dreamoon Likes Sequences 题解(思维+求贡献)
题目链接 题目大意 让你构造一个严格单调上升的数组a满足\(1<=a_1<a_2<....a_n<=d\) 而且要使得这个数组的异或前缀和也满足严格单调上升,求有多少个满足条件 ...
- Docker基础知识及入门
什么是Docker? Docker是由dotcloud公司使用golang语言进行开发的,基于Linux内核的 cgroup,namespace,以及OverlayFS类的Union FS等技术,对进 ...
- 经典算法—BF算法(字符串匹配)
前言 字符串的匹配算法也是很经典的一个算法,在面试的时候常常会遇到,而BF算法是字符串模式匹配中的一个简单的算法 1,什么是BF算法 BF算法,即暴力(Brute Force)算法,是普通的模式匹配算 ...