/*
期望的状态转移比较容易推出来,我们发现,对于每一个状态转移,总有一项是dp[0],通过观察我们可以发现,任何一个dp[i]均可以表达为dp[0]的线性表达式,最后再推导出系数就可以求解
*/
#include <cstdio>
#include <cstring>
#include <cmath>
int n,k1,k2,k3,a,b,c;
double dp1[555];
double dp2[555];
bool vis[555];
void solve(int loc)//loc<=n
{
if(vis[loc]) return;
for(int i=1;i<=k1;i++)
{
for(int j=1;j<=k2;j++)
{
for(int k=1;k<=k3;k++)
{
if(i==a&&j==b&&k==c)
{
dp1[loc]+=1.;
}
else
{
if(loc+i+j+k<=n)
{
solve(loc+i+j+k);
dp1[loc]+=dp1[loc+i+j+k];
dp2[loc]+=dp2[loc+i+j+k];
}
}
}
}
}
dp1[loc]/=(double)(k1*k2*k3);
dp2[loc]/=(double)(k1*k2*k3);
dp2[loc]+=1.;
vis[loc]=true;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d%d%d%d%d",&n,&k1,&k2,&k3,&a,&b,&c);
memset(vis,false,sizeof(vis));
memset(dp1,0,sizeof(dp1));
memset(dp2,0,sizeof(dp2));
solve(0);
//printf("%lf %lf\n",dp1[0],dp2[0]);
printf("%.15lf\n",dp2[0]/(1.-dp1[0]));
}
return 0;
}
ZOJ 3329 One Person Game
最新推荐文章于 2021-04-10 21:56:02 发布
