题意:36张扑克,平分成9摞,两张数字一样的可以拿走,每次随机拿两张,问能拿光的概率。
思路:
直接用搜索,表示出每摞剩余的牌数,然后利用全概率公式即可(P(A) = p(A|b1)*p(b1)+.....+p(A|bn)*p(bn))

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <algorithm>
typedef long long ll;
using namespace std;
int p[10];
int num[9][5];
double dp[5][5][5][5][5][5][5][5][5]; //不同状态时的概率
int vis[5][5][5][5][5][5][5][5][5]; //是否已经搜过
char t1[4],t2[4],t3[4],t4[4]; double dfs(int x1,int x2,int x3,int x4,int x5,int x6,int x7,int x8,int x9)
{
if(vis[x1][x2][x3][x4][x5][x6][x7][x8][x9])
return dp[x1][x2][x3][x4][x5][x6][x7][x8][x9];
vis[x1][x2][x3][x4][x5][x6][x7][x8][x9] = 1;
int top[10] = {x1,x2,x3,x4,x5,x6,x7,x8,x9};
int flag = 0;
for(int i = 0; i < 9; i++) //判断是否已经取完
{
if(top[i])
{
flag = 1;
break;
}
}
if(!flag )
return dp[x1][x2][x3][x4][x5][x6][x7][x8][x9] = 1.0;
int pnum = 0;
double sum = 0.0; //当前情况往下取成功的概率
for(int i = 0; i < 9; i ++)
{
for(int j = i+1; j < 9 && top[i] != 0; j++)
{
if(num[i][top[i]] == num[j][top[j]])
{
top[i]--;
top[j]--;
pnum++; //当前情况下有多少种取法
sum += dfs(top[0],top[1],top[2],top[3],top[4],top[5],top[6],top[7],top[8]);
top[i]++;
top[j]++;
}
}
}
if(sum > 0)
dp[x1][x2][x3][x4][x5][x6][x7][x8][x9] =(sum/(1.0*pnum));
return dp[x1][x2][x3][x4][x5][x6][x7][x8][x9];
} int main()
{
while(scanf("%s%s%s%s",t1,t2,t3,t4) != EOF)
{
num[0][1] = t1[0];
num[0][2] = t2[0];
num[0][3] = t3[0];
num[0][4] = t4[0];
for(int i = 1; i< 9; i++)
{
scanf("%s%s%s%s",t1,t2,t3,t4);
num[i][1] = t1[0];
num[i][2] = t2[0];
num[i][3] = t3[0];
num[i][4] = t4[0];
}
memset(vis,0,sizeof(vis));
memset(dp,0,sizeof(dp));
dfs(4,4,4,4,4,4,4,4,4);
printf("%.6lf\n",dp[4][4][4][4][4][4][4][4][4]);
}
return 0;
}

  

例10-12 *uva1637(概率dp)的更多相关文章

  1. [10.12模拟赛] 老大 (二分/树的直径/树形dp)

    [10.12模拟赛] 老大 题目描述 因为 OB 今年拿下 4 块金牌,学校赞助扩建劳模办公室为劳模办公室群,为了体现 OI 的特色,办公室群被设计成了树形(n 个点 n − 1 条边的无向连通图), ...

  2. 2018.12.12 codeforces 935D. Fafa and Ancient Alphabet(概率dp)

    传送门 概率dp水题. 题意简述:给你数字表的大小和两个数列,数列中为0的数表示不确定,不为0的表示确定的,求第一个数列字典序比第二个数列大的概率. fif_ifi​表示第i ni~ ni n位第一个 ...

  3. 2018.10.13 bzoj4008: [HNOI2015]亚瑟王(概率dp)

    传送门 马上2点考初赛了,心里有点小紧张. 做道概率dp压压惊吧. 话说这题最开始想错了. 最开始的方法是考虑f[i][j]f[i][j]f[i][j]表示第iii轮出牌为jjj的概率. 然后用第ii ...

  4. 【bzoj1778】[Usaco2010 Hol]Dotp 驱逐猪猡 矩阵乘法+概率dp+高斯消元

    题目描述 奶牛们建立了一个随机化的臭气炸弹来驱逐猪猡.猪猡的文明包含1到N (2 <= N <= 300)一共N个猪城.这些城市由M (1 <= M <= 44,850)条由两 ...

  5. 20190716NOIP模拟赛T1 礼物(概率dp+状压)

    题目描述 夏川的生日就要到了.作为夏川形式上的男朋友,季堂打算给夏川买一些生 日礼物. 商店里一共有种礼物.夏川每得到一种礼物,就会获得相应喜悦值Wi(每种 礼物的喜悦值不能重复获得). 每次,店员会 ...

  6. [CSP-S模拟测试]:糊涂图(概率DP)

    题目传送门(内部题76) 输入格式 第一行输入三个空格隔开的整数$n,m,s$表示随机加一条边之前的糊涂图的点数,边数,以及起点的编号. 接下来$m$行,每行两个空格隔开的整数$a,b$表示从$a$到 ...

  7. [转]概率DP总结 by kuangbin

    概率类题目一直比较弱,准备把kuangbin大师傅总结的这篇题刷一下! 我把下面的代码换成了自己的代码! 原文地址:http://www.cnblogs.com/kuangbin/archive/20 ...

  8. poj 2096 Collecting Bugs (概率dp 天数期望)

    题目链接 题意: 一个人受雇于某公司要找出某个软件的bugs和subcomponents,这个软件一共有n个bugs和s个subcomponents,每次他都能同时随机发现1个bug和1个subcom ...

  9. CF_229E_Gift_概率DP+组合数学

    CF_229E_Gift_概率DP+组合数学 题目描述: 很久很久以前,一位老人和他的妻子住在蔚蓝的海边.有一天,这位老人前去捕鱼,他捉到了一条活着的金鱼.鱼说:“噢,老渔人!我祈求你放我回到海里,这 ...

随机推荐

  1. 【iOS】swift-获取webView的高度

        func webViewDidFinishLoad(webView: UIWebView) {         let webHeightStr = webView.stringByEvalu ...

  2. 2017 国庆湖南 Day6

    期望得分:100+100+60=260 实际得分:100+85+0=185 二分最后一条相交线段的位置 #include<cstdio> #include<iostream> ...

  3. JDBC操作数据库的三种方式比较

    JDBC(java Database Connectivity)java数据库连接,是一种用于执行上sql语句的javaAPI,可以为多种关系型数据库提供统一访问接口.我们项目中经常用到的MySQL. ...

  4. JAVA_SE基础——47.接口

    如果一个抽象类中的所有方法都是抽象的,则可以将这个类用另一种方法来定义,即接口~ 在定义接口时,需要用interface关键字来声明,具体实例如code1 接口的定义格式:interface 接口名{ ...

  5. 云计算学习(5-1)云平台产品介绍-华为的FusionCloud产品

    FusionSphere云平台:继承了虚拟化和云管理系统,为企业构建私有云  FusionManager:云管理平台(管理计算虚拟化.网络虚拟化.存储虚拟化) FusionCompute.Fusion ...

  6. JDBC学习笔记 day1

    JDBC的基本概念: JDBC就是java database connectivity,即java数据库连接. JDBC主要完成的几个任务分别为 与数据库建立一个连接 向数据库发送SQL语句 处理数据 ...

  7. java实现两个int数交换

    普通方法,进阶方法,大神方法 @Test public void test3(){ int m = 5; int n = 12; //要求m和n交换位置 System.out.println(&quo ...

  8. java字符串类型常量拼接与变量拼接的区别

    前言 首先看下下面代码结果是什么? package cn.demo_01; public class StringDemo02 { public static void main(String[] a ...

  9. Linux kernel 4.9及以上开启TCP BBR拥塞算法

    Linux kernel 4.9及以上开启TCP BBR拥塞算法 BBR 目的是要尽量跑满带宽, 并且尽量不要有排队的情况, 效果并不比速锐差 Linux kernel 4.9+ 已支持 tcp_bb ...

  10. python 元组(tuple)的使用方法介绍

    一.元组定义 元组和列表类似,元组使用的是小括号,列表是中括号,但是元组不像列表那样可以增删改:如果列表中存在列表或字符串,那么可以对其进行修改. 创建一个元组,只需要括号中添加元素,元素用逗号隔开即 ...