YM一下zyc,瞬间拍完1A
a的期望=sum(a的子状态期望*a的子状态的概率)。
#include <iostream> #include <cstring> #include <cstdio> using namespace std; double dp[15][15][15][15][5][5]; //期望 bool vis[15][15][15][15][5][5]; int e[5]; inline double min(double a,double b,double c,double d) { a=a<b?a:b;c=c<d?c:d; return a<c?a:c; } double dfs(int a,int b,int c,int d,int x,int y) { double &now=dp[a][b][c][d][x][y]; bool &vi=vis[a][b][c][d][x][y]; if(vi) return now; vi=1; #define r(i) (x==i)+(y==i) int sum=a+b+c+d+(x>0)+(y>0); if(a+r(1)>=e[1]&&b+r(2)>=e[2]&&c+r(3)>=e[3]&&d+r(4)>=e[4]) return now=sum; now=0;sum=54-sum; if(a<13) now+=dfs(a+1,b,c,d,x,y)*(13-a)/sum; if(b<13) now+=dfs(a,b+1,c,d,x,y)*(13-b)/sum; if(c<13) now+=dfs(a,b,c+1,d,x,y)*(13-c)/sum; if(d<13) now+=dfs(a,b,c,d+1,x,y)*(13-d)/sum; #define s(i) dfs(a,b,c,d,i,y) #define t(i) dfs(a,b,c,d,x,i) if(!x) now+=min(s(1),s(2),s(3),s(4))*2/sum; else if(!y) now+=min(t(1),t(2),t(3),t(4))/sum; if(now<1e-8) now=1e10; return now; } double cal() { int cnt=0; for(int i=1;i<=4;i++) cnt+=e[i]>13?e[i]-13:0; if(cnt>2) return -1; memset(vis,0,sizeof(vis)); return dfs(0,0,0,0,0,0); } int main() { int t;cin>>t; for(int cas=1;cas<=t;cas++) { for(int i=1;i<=4;i++) cin>>e[i]; printf("Case %d: %.3f\n",cas,cal()); } return 0; }