单人纸牌

时间限制: 1 Sec  内存限制: 128 MB

题目描述

单人纸牌游戏,共 36 张牌分成 9 叠,每叠 4 张牌面向上。每次,游戏者可以从某两个不同的牌堆最顶上取出两张牌面相同的牌(如黑桃 10 和梅花 10)并且一起拿走。如果最后所有纸牌都被取走,则游戏者就赢了,否则游戏者就输了。
George 很热衷于玩这个游戏,但是一旦有时有多种选择的方法,George 就不知道取哪一种好了,George 会从中随机地选择一种走,例如:顶上的 9 张牌为 KS, KH, KD, 9H,8S, 8D, 7C, 7D,6H,显然有 5 种取法:(KS, KH), (KS, KD), (KH, KD), (8S,8D), (7C, 7D),当然 George 取到每一种取法的概率都是 1/5。
有一次,George 的朋友 Andrew 告诉他,这样做是很愚蠢的,不过 George 不相信,他认为如此玩最后成功的概率是非常大的。请写一个程序帮助 George 证明他的结论:计算按照他的策略,最后胜利的概率。

输入

9 行每行 4 组用空格分开的字串,每个字串两个字符,分别表示牌面和花色,按照从堆底到堆顶的顺序给出。

输出

一行,最后胜利的概率,精确到小数点后 3 位。

样例输入

AS 9S 6C KS
JC QH AC KH
7S QD JD KD
QS TS JS 9H
6D TD AD 8S
QC TH KC 8D
8C 9D TC 7C
9C 7H JH 7D
8H 6S AH 6H

样例输出

0.589
题解:
注意“按照从堆底到堆顶的顺序给出”,所以输入的数应该先反过来DP
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<queue>
#include<stack>
#include<ctime>
#include<vector>
using namespace std;
double f[][][][][][][][][];
int j[],s[];
char a[][];
int main()
{
int i,k;
for(i=; i<=; i++)
{
char s[];
gets(s+);
a[i][]=s[];
a[i][]=s[];
a[i][]=s[];
a[i][]=s[];
}
f[][][][][][][][][]=;
for(j[]=; j[]<=; j[]++)
{
for(j[]=; j[]<=; j[]++)
{
for(j[]=; j[]<=; j[]++)
{
for(j[]=; j[]<=; j[]++)
{
for(j[]=; j[]<=; j[]++)
{
for(j[]=; j[]<=; j[]++)
{
for(j[]=; j[]<=; j[]++)
{
for(j[]=; j[]<=; j[]++)
{
for(j[]=; j[]<=; j[]++)
{
if(f[j[]][j[]][j[]][j[]][j[]][j[]][j[]][j[]][j[]]!=)
{
double cnt=;
for(i=; i<=; i++)
for(k=i+; k<=; k++)
if(j[i]+<=&&j[k]+<=&&a[i][j[i]+]==a[k][j[k]+])cnt++;
if(cnt==)continue;
for(i=; i<=; i++)
{
for(k=i+; k<=; k++)
{
if(j[i]+<=&&j[k]+<=&&a[i][j[i]+]==a[k][j[k]+])
{
s[i]++;s[k]++;
f[j[]+s[]][j[]+s[]][j[]+s[]][j[]+s[]][j[]+s[]][j[]+s[]][j[]+s[]][j[]+s[]][j[]+s[]]+=f[j[]][j[]][j[]][j[]][j[]][j[]][j[]][j[]][j[]]/cnt;
s[i]--;s[k]--;
}
}
}
}
}
}
}
}
}
}
}
}
}
printf("%.3lf",f[][][][][][][][][]);
return ;
}

最新文章

  1. Canvas小游戏里,删除过期或者死亡元素技巧
  2. Erlang环境用eclipse搭建
  3. arpg网页游戏之地图(四)
  4. 继续Wcf记录点滴
  5. XSS的DOS攻击之 server limit dos
  6. Shared Assembilies and Strongly Named Assemblies
  7. phpQuery采集微信公众号文章乱码
  8. C#中使用DLL文件
  9. Android 获取手机SIM资料详解
  10. wpf CollectionViewSource与ListBox的折叠、分组显示,及输入关键字 Filter的筛选
  11. 【spoj LCS2】 Longest Common Substring II
  12. 降低Redis内存占用
  13. MPSOC之7——开发流程uramdisk
  14. webapi框架搭建-创建项目(一)
  15. Nginx安装及配置详解
  16. java中用swing做一个windows计算器
  17. vhdl 数据类型转换 使用IEEE标准库numeric_std 需要进行两次转换 use ieee.numeric_std.all;
  18. unity 根据平板 或者 手机 确立横竖屏
  19. MFC控件编程之组合框跟列表框
  20. Spring Security(一):官网向导翻译

热门文章

  1. mysql的下载地址+Download WinMD5
  2. 运用三角不等式加速Kmeans聚类算法
  3. ASP.NET MVC5+EF6+EasyUI 后台管理系统(83)-Easyui Datagrid 行内编辑扩展
  4. CVE-2014-0038内核漏洞原理与本地提权利用代码实现分析 作者:seteuid0
  5. jqPaginator 项目中做分页的应用技巧
  6. 使用java对文件批量重命名
  7. [大数据]-Logstash-5.3.1的安装导入数据到Elasticsearch5.3.1并配置同义词过滤
  8. JDBC与JNDI的区别
  9. Java字节码—ASM
  10. FPGA两种寄存器的使能