期望dp的状态转移方程
C++ 代码
#include<bits/stdc++.h>
using namespace std;
#define eps 1e-8
double F[15][15][15][15][5][5],E;
bool vis[15][15][15][15][5][5];
int A,B,C,D;
double dfs(int a,int b,int c,int d,int e,int f)
{
if(F[a][b][c][d][e][f]>1e-8) return F[a][b][c][d][e][f];
if(a+(e==1)+(f==1)>=A&&b+(e==2)+(f==2)>=B&&
c+(e==3)+(f==3)>=C&&d+(e==4)+(f==4)>=D) return 0;
double sum=1.0,Min1=1e9,Min2=1e9;
int cnt = a+b+c+d+(e!=0)+(f!=0);
if(a<13) sum+=dfs(a+1,b,c,d,e,f)*(13-a)/(54-cnt);
if(b<13) sum+=dfs(a,b+1,c,d,e,f)*(13-b)/(54-cnt);
if(c<13) sum+=dfs(a,b,c+1,d,e,f)*(13-c)/(54-cnt);
if(d<13) sum+=dfs(a,b,c,d+1,e,f)*(13-d)/(54-cnt);
if(e==0)for(int i=1;i<5;++i)Min1=min(Min1,dfs(a,b,c,d,i,f)/(54-cnt));
if(f==0)for(int i=1;i<5;++i)Min2=min(Min2,dfs(a,b,c,d,e,i)/(54-cnt));
if(e==0)sum+=Min1;
if(f==0)sum+=Min2;
return F[a][b][c][d][e][f]=sum;
}
int main(int argc, char const *argv[])
{
scanf("%d%d%d%d",&A,&B,&C,&D);
if(max(A-13,0)+max(B-13,0)+max(C-13,0)+max(D-13,0)>2)
return puts("-1.000"),0;
double ans = dfs(0,0,0,0,0,0);
printf("%.3f",ans);
return 0;
}
=1.0的赋值有什么意义?
压行鬼才