您的位置:首页 > 其它

PKU 3716 Panda's Birthday Present (概率问题)

2014-07-14 17:13 405 查看
题意:有4个骰子,每个骰子每面包含red或blue两种颜色,每次投掷4个骰子,red向上的数量为分数,

现在给出第一次和第二次的分数,求第三次得分的期望。

思路参考http://hi.baidu.com/bfcdygoporbjuxr/item/569897ddc1fc561d21e2503f

#include<stdio.h>
#include<string.h>
#include<string>
#include<map>
#include<stack>
#include<math.h>
#include<queue>
#include<vector>
#include<stdlib.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define N 2010
#define eps 1e-5
double C[7]={1,6,15,20,15,6,1};
double pn[7][7][7][7];//pn[i][j][k][l]表示4个骰子各有i,j,k,l个red面的概率
double pr[5][7][7][7][7];//pr[red][i][j][k][l]表示4个骰子每个骰子各有i,j,k,l个red面,且共有red个朝上的概率
int cr[5];//每个骰子有多少个red面
int t,n,m;
int i,j,k,l;
void init()
{
for(i=0;i<7;i++) for(j=0;j<7;j++)
for(k=0;k<7;k++) for(l=0;l<7;l++)
pn[i][j][k][l]=(C[i]*C[j]*C[k]*C[l])/(64*64*64*64);
}
void dfs1(int num,int red,double p)
{
if(num==4)
{
pr[red][cr[0]][cr[1]][cr[2]][cr[3]]+=p;
return;
}
dfs1(num+1,red+1,p*cr[num]/6.0);
dfs1(num+1,red,p*(6-cr[num])/6.0);
}
void dfs(int num)
{
if(num==4)
{
dfs1(0,0,1);
return ;
}
for(int i=0;i<7;i++)
{
cr[num]=i;
dfs(num+1);
}
}
int main()
{

init();
dfs(0);
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
double P=0.0,ans=0.0;
for(i=0;i<7;i++) for(j=0;j<7;j++)
for(k=0;k<7;k++) for(l=0;l<7;l++)
P+=pn[i][j][k][l]*pr
[i][j][k][l]*pr[m][i][j][k][l];
for(i=0;i<7;i++) for(j=0;j<7;j++)
for(k=0;k<7;k++) for(l=0;l<7;l++)
for(int r=0;r<5;r++)
ans+=r*pn[i][j][k][l]*pr[r][i][j][k][l]*pr
[i][j][k][l]*pr[m][i][j][k][l];
ans/=P;
printf("%.3lf\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: