UvaLive 5811 概率DP
题意 : 有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的更多相关文章
- UVALive 6672 Bonus Cards 概率dp
题意呢 就是有两种售票方式 一种是icpc 一种是其他方式 icpc抢票成功的概率是其他方式的2倍…… 这时 一个人出现了 他通过内幕知道了两种抢票方式各有多少人 他想知道自己如果用icpc抢票成功的 ...
- UVALive 6514:Crusher’s Code(概率dp)
题目链接 https://icpcarchive.ecs.baylor.edu/external/65/6514.pdf 题意:给出n个数(n<8) 求这n个数分别两个程序排成有序时,程序的期望 ...
- 概率dp小结
好久之前学过,记得是一次亚洲区的前几天看了看概率dp,然后亚洲区就出了一道概率dp,当时虽然做上了,但是感觉有很多地方没懂,今天起早温习了一下,觉得很多地方茅塞顿开,果然学习的话早上效果最好了. 首先 ...
- Codeforces 28C [概率DP]
/* 大连热身D题 题意: 有n个人,m个浴室每个浴室有ai个喷头,每个人等概率得选择一个浴室. 每个浴室的人都在喷头前边排队,而且每个浴室内保证大家都尽可能均匀得在喷头后边排队. 求所有浴室中最长队 ...
- HDU 4405 Aeroplane chess (概率DP)
题意:你从0开始,要跳到 n 这个位置,如果当前位置是一个飞行点,那么可以跳过去,要不然就只能掷骰子,问你要掷的次数数学期望,到达或者超过n. 析:概率DP,dp[i] 表示从 i 这个位置到达 n ...
- POJ 2096 Collecting Bugs (概率DP)
题意:给定 n 类bug,和 s 个子系统,每天可以找出一个bug,求找出 n 类型的bug,并且 s 个都至少有一个的期望是多少. 析:应该是一个很简单的概率DP,dp[i][j] 表示已经从 j ...
- POJ 2151 Check the difficulty of problems (概率DP)
题意:ACM比赛中,共M道题,T个队,pij表示第i队解出第j题的概率 ,求每队至少解出一题且冠军队至少解出N道题的概率. 析:概率DP,dp[i][j][k] 表示第 i 个队伍,前 j 个题,解出 ...
- 概率DP light oj 1030
t组数据 n块黄金 到这里就捡起来 出发点1 到n结束 点+位置>n 重掷一次 dp[i] 代表到这里的概率 dp[i]=(dp[i-1]+dp[i-2]... )/6 如果满6个的话 否则 ...
- hdu 4050 2011北京赛区网络赛K 概率dp ***
题目:给出1-n连续的方格,从0开始,每一个格子有4个状态,左右脚交替,向右跳,而且每一步的步长必须在给定的区间之内.当跳出n个格子或者没有格子可以跳的时候就结束了,求出游戏的期望步数 0:表示不能到 ...
随机推荐
- linux linux 互传文件 win 不通过 ftp sftp 往linux 传文件(文件夹)
linux 传入 传出文件 swp port 22 怎样通过swp通过docker 容器向外传文件 通过scp Linux互传文件,需要知道文件源 file source 所在系统的ip wuse ...
- Encrypt your home directory
w
- jquery.fileDownload plugin: Success msg alert before actual pdf download completed
Currently , I use jquery fileDownload plugin to download multiple pdf that in a list page, which eve ...
- window.onload和$(document).ready()比较
浏览器在页面加载完毕后,JS通常使用window.onload方法为DOM元素添加事件,而jQuery使用的是$(document).ready()方法.两者功能相似,但也有细微差异,下面简要对比一下 ...
- 洗牌算法Fisher-Yates以及C语言随机数的产生
前些天在蘑菇街的面试中碰到一道洗牌的算法题,拿出来和大家分享一下! 原题是:54张有序的牌,如何无序的发给3个人? 这个题是运用经典的洗牌算法完成.首先介绍一种经典的洗牌算法--Fisher-Yate ...
- Kafka的架构
1.Kafka整体架构 一个典型的Kafka集群中包含若干producer(可以是web前端产生的page view,或者是服务器日志,系统CPU.memory等),若干broker(Kafka ...
- C#(ASP.NET)隐藏或显示Excel中指定列
今天写的一个方法,实现Excel指定列的隐藏和显示: 环境:VS2010,OFFICE 2010 代码:#region 隐藏和显示Excel中的一列 /// <summary> ...
- 做测试时,启动SpringBoot出现警告,在ClassPath中一个类多次出现
Found multiple occurrences of org.json.JSONObject on the class path: jar:file:/C:/Users/niaomingjian ...
- LeetCode:罗马数字转整数【13】
LeetCode:罗马数字转整数[13] 题目描述 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 10 ...
- UI控件之UIView与动画
UIView:用来展示用户的界面,响应用户的操作(继承自UIResponder) UIView的作用:绘图.动画.处理事件 UIView可以包含和管理子视图,并且决定子视图的位置大小 获取所有的子视图 ...