Codeforces 540D Bad Luck Island
题意
一个岛上有r个石头,s个剪刀,p个布.每两个物品碰到的几率相等.
如果两个不同种类的物品碰到了,石头会把剪刀干掉,剪刀会把布干掉,布会把石头干掉.
求当岛上只剩下一种物品的时候,这种物品分别是石头,剪刀,布的概率.
题解
gay率dp.
令dp[i][j][k]
表示当前的那种物品有
i
i
个,会被它干掉的物品有个,它的情敌天敌有
k
k
个时当前物品能够获胜的概率.
答案就是dp[r][s][p],dp[s][p][r],dp[p][r][s]
.(很明显三种物品的情况是可以轮转的.)
显然当等于0的时候,只要
i
i
不为0,值都为(活下来的必定是它).
所以dp[i][j][0]=1.
同时在三种物品分别有
i,j,k
i
,
j
,
k
个的时候,会导致有物品死亡的相遇方法有
i×j+i×k+j×k
i
×
j
+
i
×
k
+
j
×
k
种.
假设当前考虑的物品是石头(剪刀或者布是一样的).
那么有
i×j
i
×
j
种可能,石头碰到了剪刀,剪刀死了.
这样的话石头活着的可能方法有
i×j×dp[i][j−1][k]
i
×
j
×
d
p
[
i
]
[
j
−
1
]
[
k
]
种.
同理如果石头碰到了布,可能方法有
i×k×dp[i−1][j][k]
i
×
k
×
d
p
[
i
−
1
]
[
j
]
[
k
]
(石头死了一个.)
……最后除以相遇方法的总数.
综上所述,
dp[i][j][k]=(i*j*dp[i][j-1][k]+i*k*dp[i-1][j][k]+j*k*dp[i][j][k-1])/(i*j+i*k+j*k);
这样此题便解决了.
double dp[105][105][105];
int main(){
int i,j,k,r=read(),s=read(),p=read();
for (i=1;i<=100;++i){
for (j=1;j<=100;++j){
dp[i][j][0]=1;
for (k=1;k<=100;++k){
dp[i][j][k]+=(i*j*dp[i][j-1][k]+j*k*dp[i][j][k-1]+i*k*dp[i-1][j][k])/(i*j+i*k+j*k);
}
}
}
printf("%.12lf %.12lf %.12lf",dp[r][s][p],dp[s][p][r],dp[p][r][s]);
}