题意:有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[n][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[n][i][j][k][l]*pr[m][i][j][k][l]; ans/=P; printf("%.3lf\n",ans); } return 0; }