Codeforces 540D Bad Luck Island gay率dp

55 篇文章 0 订阅
1 篇文章 0 订阅

Codeforces 540D Bad Luck Island

题意

一个岛上有r个石头,s个剪刀,p个布.每两个物品碰到的几率相等.
如果两个不同种类的物品碰到了,石头会把剪刀干掉,剪刀会把布干掉,布会把石头干掉.
求当岛上只剩下一种物品的时候,这种物品分别是石头,剪刀,布的概率.

题解

gay率dp.
dp[i][j][k]表示当前的那种物品有 i i 个,会被它干掉的物品有j个,它的情敌天敌有 k k 个时当前物品能够获胜的概率.
答案就是dp[r][s][p],dp[s][p][r],dp[p][r][s].(很明显三种物品的情况是可以轮转的.)
显然当k等于0的时候,只要 i i 不为0,值都为1(活下来的必定是它).
所以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][j1][k] i × j × d p [ i ] [ j − 1 ] [ k ] 种.
同理如果石头碰到了布,可能方法有 i×k×dp[i1][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]);
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值