标签:
样例输入1
1 2 3 4
样例输入2
15 15 15 15
样例输出1
16.393
样例输出2
-1.000
决策挺复杂的。
现在不想写解析,日后补。
1 /*by SilverN*/ 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cstdio> 6 #include<cmath> 7 using namespace std; 8 const int mxn=15; 9 double f[mxn][mxn][mxn][mxn][5][5]; 10 bool vis[mxn][mxn][mxn][mxn][5][5]; 11 int x1,x2,x3,x4; 12 double dp(int a,int b,int c,int d,int e,int g){ 13 if(vis[a][b][c][d][e][g])return f[a][b][c][d][e][g]; 14 int i; 15 16 if(((a+(e==0)+(g==0))>=x1) && ((b+(e==1)+(g==1))>=x2) && ((c+(e==2)+(g==2))>=x3) && ((d+(e==3)+(g==3))>=x4)) 17 return f[a][b][c][d][e][g]=0; 18 int sum=a+b+c+d+(e!=4)+(g!=4); 19 double tmp=1; 20 //普通 21 if(a<13)tmp+=dp(a+1,b,c,d,e,g)*(13-a)/(54-sum); 22 if(b<13)tmp+=dp(a,b+1,c,d,e,g)*(13-b)/(54-sum); 23 if(c<13)tmp+=dp(a,b,c+1,d,e,g)*(13-c)/(54-sum); 24 if(d<13)tmp+=dp(a,b,c,d+1,e,g)*(13-d)/(54-sum); 25 //王 26 double es; 27 if(e==4){ 28 es=100; 29 for(i=0;i<=3;i++) es=min(dp(a,b,c,d,i,g)/(54-sum),es); 30 tmp+=es; 31 } 32 if(g==4){ 33 es=100; 34 for(i=0;i<=3;i++) es=min(dp(a,b,c,d,e,i)/(54-sum),es); 35 tmp+=es; 36 } 37 38 vis[a][b][c][d][e][g]=1; 39 return f[a][b][c][d][e][g]=tmp; 40 } 41 int main(){ 42 memset(vis,0,sizeof(vis)); 43 int a,b,c,d; 44 scanf("%d%d%d%d",&x1,&x2,&x3,&x4); 45 double ans=dp(0,0,0,0,4,4); 46 if(ans>54)ans=-1; 47 printf("%.3lf\n",ans); 48 return 0; 49 }
标签:
原文地址:http://www.cnblogs.com/SilverNebula/p/5636219.html