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 ...
随机推荐
- mon磁盘满重启的问题
问题 Ceph monitors 100% full filesystem, refusing start 问题原文 I have an issue with a (not in production ...
- abp(net core)+easyui+efcore实现仓储管理系统——出库管理之六(五十五)
abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统--ABP总体介绍(一) abp(net core)+ ...
- hectf2020部分简单题题解wp
HECTF 我真是又菜又没时间肝题..又又又只水了波简单题... Reverse 1.Hello_Re file查一波 32bit,拖进IDA中 老规矩shift+F12 查看字符串: 跳转 F5查看 ...
- 面试BAT必问的JVM,今天我们来说一说它类加载器的底层原理
类加载器的关系 类加载器的分类 JVM支持两种类加载器,一种为引导类加载器(Bootstrap ClassLoader),另外一种是自定义类加载器(User Defined ClassLoader) ...
- C# Random类的正确应用
Random类介绍 Random类一个用于产生伪随机数字的类.这里的伪随机表示有随机性但是可以基于算法模拟出随机规律. Random类的构造方式有两种. Random r= new Random(). ...
- css3系列之animation实现逐帧动画
上面这个两个简单的动画,是用 animation-timing-function: steps(); 这个属性实现的,具体如何实现,看下面: 这上面的图片,也就是我们的素材, 有些人,可能不是很理解 ...
- css3系列之伪元素选择器
Pseudo-Element Selectors(伪元素选择器) E::placeholder E::selection E::placeholder 这个选择器是选啥的呢, 是选 input 里面的 ...
- 【PYTEST】第四章Fixture
知识点: 利用fixture共享数据 conftest.py共享fixture 使用多个fixture fixture作用范围 usefixture 重命名 1. 利用fixture共享数据 test ...
- leetcode 1046
class Solution { public int lastStoneWeight(int[] stones) { MaxHeap s=new MaxHeap(stone ...
- jmeter简单的压力测试
Jmeter是一个非常好用的压力测试工具. Jmeter用来做轻量级的压力测试,非常合适,只需要十几分钟,就能把压力测试需要的脚本写好.相比LR来说操作简单方便,关键是免费,基于JAVA开发,所以需 ...