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 ...
随机推荐
- FreeMark导出word文件
1.编辑好word 2.将word模板另存为xml格式, 把需要动态生成的文字用${xxx}代替 eg: 张强 替换为:${name} 注意:图片是很长的一个base64的字符,同样替换就好 比如替换 ...
- centos 7.6 虚拟机开启网卡
1. 2. > cd /etc/sysconfig/network-scripts 3. > vi ifcfg-enp0s3 上图标红区域,默认值是:no,改为yes:保存. 4. ...
- Vector和ArrayList的联系和区别
Vector和ArrayList的联系和区别 1.联系: 实用原理相同 功能相同 都是长度可变的数组结构,很多情况下可以互用 2.两者的主要区别:
- overflow:scroll
<div style="position: relative;"> <div class="container mycontent" styl ...
- Appium上下文和H5测试(一)
坚持原创输出,点击蓝字关注我吧 作者:清菡 博客:oschina.云+社区.知乎等各大平台都有. 目录 一.混合应用-H5 1.混合应用是什么? 2.怎么样分辨一个 App 页面究竟是原生的还是 We ...
- Java学习之Swing Gui编程
Java学习之Swing Gui编程 0x00 前言 前面的使用的Gui是基于Awt 去进行实现,但是在现实写Gui中 AWT实际运用会比较少. 0x01 Swing 概述 AWT 和Swing 区别 ...
- Jmeter (三)变量、参数化、函数
一.参数化 1.在参数中定义变量:${变量名称} 变量定义:2种 2.在用户自定义变量User Defined Variable 或者 用户参数User Parameters中,设置key.value ...
- DNS系列—DNS简介
DNS是什么? 如果了解互联网主机之间是用IP地址来进行通信的话,有了这个认识的前提,我们来聊一下什么是DNS.一个IP地址有十几个字符那么长,和手机号码长度差不多,我们怎么记住这些我们想要访问的主机 ...
- mysql-查询不同列的数量合计
车辆违规信息表testmodel_test 表结构: 表字段:cra_id(车牌号),if_weigui(该次行驶是否违规,0是正常,1是违规) 目的: 查询表中共有几辆车,违规的有几辆车: 方法1 ...
- Spring mvc与springboot
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration: viewResolver 类路径文件 把类路径下 ...