题意 : 有54张牌 问抽多少张牌能使每种花色都至少是给定的数字 两张王牌可以被选择为任何花色

高放学长真是太腻害辣!

设置dp[][][][][x][y] 前四维代表四种真的花色的数量 后两维xy代表大王与小王的使用情况——是没有用到 还是作为1234

于是dp[i][j][k][l][x][y]当x为0时 可以来自于dp[i][j][k][l][1][y] dp....[2][y]....

期望倒推 所以 当前的四种状态都已经算出来了 选一个最小的 即“选一个最小的期望转变” // 事实上我们已经知道四种分支各自还需要抽牌的期望了

当ijkl<13时 还可能来自于dp[i+1][k][j][l][x][y] 即正常抽牌

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<map>
#include<iostream>
#include<string>
#include<vector>
#include<queue>
using namespace std;
#define L long long double dp[16][16][16][16][5][5] ;
bool f[16][16][16][16][5][5] ;
int a,b,c,d; int main(){
int t;
scanf("%d",&t);
int cas = 1 ;
while(t--) {
scanf("%d%d%d%d",&a,&b,&c,&d) ;
int jz=0;
if(a>13)jz+=(a-13);
if(b>13)jz+=(b-13);
if(c>13)jz+=(c-13);
if(d>13)jz+=(d-13);
if(jz>2){
printf("Case %d: -1.000\n",cas++);
continue;
}
memset(dp,0,sizeof(dp));
memset(f,false,sizeof(f));
for(int i=13;i>=0;i--){
for(int j=13;j>=0;j--){
for(int k=13;k>=0;k--){
for(int l=13;l>=0;l--){
for(int x=4;x>=0;x--){
for(int y=4;y>=0;y--){
int aa=i,bb=j,cc=k,dd=l;
if(x==1)aa++;
else if(x==2)bb++;
else if(x==3)cc++;
else if(x==4)dd++;
if(y==1)aa++;
else if(y==2)bb++;
else if(y==3)cc++;
else if(y==4)dd++;
if(aa>=a&&bb>=b&&cc>=c&&dd>=d){ }
else {
f[i][j][k][l][x][y] = true ;
}
}
}
}
}
}
}
for(int i=13;i>=0;i--){
for(int j=13;j>=0;j--){
for(int k=13;k>=0;k--){
for(int l=13;l>=0;l--){
for(int x=4;x>=0;x--){
for(int y=4;y>=0;y--){
int aa=i,bb=j,cc=k,dd=l;
if(x==1)aa++;
else if(x==2)bb++;
else if(x==3)cc++;
else if(x==4)dd++;
if(y==1)aa++;
else if(y==2)bb++;
else if(y==3)cc++;
else if(y==4)dd++;
if(f[i][j][k][l][x][y]==true){
f[i][j][k][l][x][y]=false;
int sum=54-aa-bb-cc-dd;
int s=0;
if(x!=0)s++;
if(y!=0)s++;
dp[i][j][k][l][x][y] = 1.0 ;
if(x==0){
double u = min(min(dp[i][j][k][l][1][y],dp[i][j][k][l][2][y]),min(dp[i][j][k][l][3][y],dp[i][j][k][l][4][y])) ;
dp[i][j][k][l][x][y] += u * 1.0/sum ;
}
if(y==0){
double u = min(min(dp[i][j][k][l][x][1],dp[i][j][k][l][x][2]),min(dp[i][j][k][l][x][3],dp[i][j][k][l][x][4])) ;
dp[i][j][k][l][x][y] += u * 1.0/sum ;
}
if(i<13)dp[i][j][k][l][x][y] += dp[i+1][j][k][l][x][y] * (13-i)*1.0/sum ;
if(j<13)dp[i][j][k][l][x][y] += dp[i][j+1][k][l][x][y] * (13-j)*1.0/sum ;
if(k<13)dp[i][j][k][l][x][y] += dp[i][j][k+1][l][x][y] * (13-k)*1.0/sum ;
if(l<13)dp[i][j][k][l][x][y] += dp[i][j][k][l+1][x][y] * (13-l)*1.0/sum ;
}
}
}
}
}
}
}
printf("Case %d: %.3f\n",cas++,dp[0][0][0][0][0][0]);
}
}

  

UvaLive 5811 概率DP的更多相关文章

  1. UVALive 6672 Bonus Cards 概率dp

    题意呢 就是有两种售票方式 一种是icpc 一种是其他方式 icpc抢票成功的概率是其他方式的2倍…… 这时 一个人出现了 他通过内幕知道了两种抢票方式各有多少人 他想知道自己如果用icpc抢票成功的 ...

  2. UVALive 6514:Crusher’s Code(概率dp)

    题目链接 https://icpcarchive.ecs.baylor.edu/external/65/6514.pdf 题意:给出n个数(n<8) 求这n个数分别两个程序排成有序时,程序的期望 ...

  3. 概率dp小结

    好久之前学过,记得是一次亚洲区的前几天看了看概率dp,然后亚洲区就出了一道概率dp,当时虽然做上了,但是感觉有很多地方没懂,今天起早温习了一下,觉得很多地方茅塞顿开,果然学习的话早上效果最好了. 首先 ...

  4. Codeforces 28C [概率DP]

    /* 大连热身D题 题意: 有n个人,m个浴室每个浴室有ai个喷头,每个人等概率得选择一个浴室. 每个浴室的人都在喷头前边排队,而且每个浴室内保证大家都尽可能均匀得在喷头后边排队. 求所有浴室中最长队 ...

  5. HDU 4405 Aeroplane chess (概率DP)

    题意:你从0开始,要跳到 n 这个位置,如果当前位置是一个飞行点,那么可以跳过去,要不然就只能掷骰子,问你要掷的次数数学期望,到达或者超过n. 析:概率DP,dp[i] 表示从 i  这个位置到达 n ...

  6. POJ 2096 Collecting Bugs (概率DP)

    题意:给定 n 类bug,和 s 个子系统,每天可以找出一个bug,求找出 n 类型的bug,并且 s 个都至少有一个的期望是多少. 析:应该是一个很简单的概率DP,dp[i][j] 表示已经从 j ...

  7. POJ 2151 Check the difficulty of problems (概率DP)

    题意:ACM比赛中,共M道题,T个队,pij表示第i队解出第j题的概率 ,求每队至少解出一题且冠军队至少解出N道题的概率. 析:概率DP,dp[i][j][k] 表示第 i 个队伍,前 j 个题,解出 ...

  8. 概率DP light oj 1030

    t组数据 n块黄金 到这里就捡起来 出发点1 到n结束  点+位置>n 重掷一次 dp[i] 代表到这里的概率 dp[i]=(dp[i-1]+dp[i-2]... )/6  如果满6个的话 否则 ...

  9. hdu 4050 2011北京赛区网络赛K 概率dp ***

    题目:给出1-n连续的方格,从0开始,每一个格子有4个状态,左右脚交替,向右跳,而且每一步的步长必须在给定的区间之内.当跳出n个格子或者没有格子可以跳的时候就结束了,求出游戏的期望步数 0:表示不能到 ...

随机推荐

  1. 【BZOJ3083/3306】遥远的国度/树 树链剖分+线段树

    [BZOJ3083]遥远的国度 Description 描述zcwwzdjn在追杀十分sb的zhx,而zhx逃入了一个遥远的国度.当zcwwzdjn准备进入遥远的国度继续追杀时,守护神RapiD阻拦了 ...

  2. 【BZOJ3994】[SDOI2015]约数个数和 莫比乌斯反演

    [BZOJ3994][SDOI2015]约数个数和 Description  设d(x)为x的约数个数,给定N.M,求   Input 输入文件包含多组测试数据. 第一行,一个整数T,表示测试数据的组 ...

  3. Java中Jedis操作Redis与Spring的整合

    Redis是一个key-value存储系统.它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合)和zset(有序集合).这些数据类型都支持push/pop. ...

  4. Bootstrap学习-排版-表单

    1.标题 <h1>~<h6>,所有标题的行高都是1.1(也就是font-size的1.1倍). 2.副标题 <small>,行高都是1,灰色(#999) <h ...

  5. spring tiles界面为空白

    Caused by: org.apache.jasper.JasperException: /WEB-INF/views/admin_template.jsp(3,62) Unable to read ...

  6. PyQt4 进度条和日历 代码

    # -*- coding: utf-8 -*- """ ------------------------------------------------- File Na ...

  7. numpy的random模块详细解析

    随机抽样 (numpy.random) 简单的随机数据 rand(d0, d1, ..., dn) 随机值 >>> np.random.rand(3,2) array([[ 0.14 ...

  8. Django进阶项目

    本来想上午轻轻松松搞定,没想到还是出了其他的问题,好在最后都解决了 在middleware.py当中 # -*- coding:utf-8 -*- __author__ = 'feimao' impo ...

  9. JAVA学习笔记----【转】 java.toString() ,(String),String.valueOf的区别

    在java项目的实际开发和应用中,常常需要用到将对象转为String这一基本功能.本文将对常用的转换方法进行一个总结. 常用的方法有Object#toString(),(String)要转换的对象,S ...

  10. docker devise相关错误

    rake aborted!Devise.secret_key was not set. Please add the following to your Devise initializer: con ...