540D - Bad Luck Island(概率DP)

原题链接:http://codeforces.com/problemset/problem/540/D

题意:给你石头、剪刀、布的数量,它们之间的石头能干掉剪刀,剪刀能干掉布,布能干掉石头,问最后石头、剪刀、布各自只有一种存活的概率。

思路:dp[i][j][k]为石头剪刀布分别剩下i,j,k个的概率。以布消灭石头为例,从dp[i][j][k]转移到dp[i-1][j][k]需要dp[i][j][k]乘上转移的概率总情况为tot=i*k+i*j+j*k,石头遇上布的情况为i*k,所以这里的概率为i*k/(i*k+i*j+j*k),则dp[i-1][j][k]=dp[i][j][k]*i*k/(i*k+i*j+j*k)。

当其中一种剩下0时结果便能知道,当其中一种剩下0时对另外两种的存活情况求和便得答案。

AC代码:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 double dp[105][105][105];
 4 int main()
 5 {
 6     int r, s, p;
 7     scanf("%d %d %d", &r, &s, &p);
 8     memset(dp, 0, sizeof(dp));
 9     dp[r][s][p]=1.0;
10     double tot;
11     for(int i=r;i>=1;i--){
12          for(int j=s;j>=1;j--){
13              for(int k=p;k>=1;k--){
14                  if(dp[i][j][k]==0.0) continue;
15                  tot=(i*k+j*i+k*j)*1.0;
16                 dp[i-1][j][k]+=(i*k*1.0/tot)*dp[i][j][k];
17                 dp[i][j-1][k]+=(i*j*1.0/tot)*dp[i][j][k];
18                 dp[i][j][k-1]+=(j*k*1.0/tot)*dp[i][j][k];
19              }
20          }
21     }
22     double res=0.0;
23     for(int i=1;i<=r;i++){
24         for(int j=0;j<=s;j++){
25             res+=dp[i][j][0];
26         }
27     }
28     printf("%.12f ", res);
29     res=0.0;
30     for(int i=1;i<=s;i++){
31         for(int j=0;j<=p;j++){
32             res+=dp[0][i][j];
33         }
34     }
35     printf("%.12f ", res);
36     res=0.0;
37     for(int i=1;i<=p;i++){
38         for(int j=0;j<=r;j++){
39             res+=dp[j][0][i];
40         }
41     }
42     printf("%.12f\n", res);
43     return 0;
44 }
时间: 2024-11-06 08:38:23

540D - Bad Luck Island(概率DP)的相关文章

CodeForces 540D Bad Luck Island 概率dp

CodeForces 540D 应该是简单概率dp,由于写得少显得十分蠢萌 求期望逆推,求概率正推,大概是这么个意思,贴一发留恋 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define db double const int maxn=108; db dp[maxn][maxn][maxn]; int main() { int i,j,n,m,k,p; whi

cf 540D D. Bad Luck Island 概率dp

D. Bad Luck Island time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output The Bad Luck Island is inhabited by three kinds of species: r rocks, s scissors and p papers. At some moments of time two

Codeforces Round #301 (Div. 2) D. Bad Luck Island 概率DP

D. Bad Luck Island The Bad Luck Island is inhabited by three kinds of species: r rocks, s scissors and p papers. At some moments of time two random individuals meet (all pairs of individuals can meet equiprobably), and if they belong to different spe

Codeforces Div.301D Bad Luck Island(概率dp+记忆化搜索)

一道概率dp问题. 题目链接:http://codeforces.com/contest/540/problem/D 题目大意:一个岛上有r个石头,s个剪子,p个布,他们之间随机挑出两个相遇,如果不是相同物种,就会有一个消失,分别求出最后这座岛上只剩下一个物种的概率. 我们用dp[i][j][k]来存储i个石头,j个剪刀,k个布时,某物种的存活概率,共dp三次,算出三个物种分别的概率. 首先,我们需要把对应想求的物种概率初始化,这里以石头为例,那么对于i从1到r,不难理解dp[i][0][0]=

Codeforces 540D Bad Luck Island - 概率+记忆化搜索

[题意] 一个岛上有三种生物A,B,C,各有多少只在输入中会告诉你,每种最多100只 A与B碰面,A会吃掉B, B与C碰面,B会吃掉C, C与A碰面,C会吃掉A...忍不住想吐槽这种环形食物链 碰面是随机的.到最后岛上只剩下一种生物,问这种生物分别是A,B,C的概率是多少. [题解] 其实很简单,这题,状态方程很好想.. 设dp[i][j][k]为生物A有i只,生物B有j只,生物C有k只的概率情况,显然dp的返回值应该有三个,分别是最后剩下该种生物的概率 那么我们考虑状态转移的情况. 如果A与B

cf540D. Bad Luck Island(概率dp)

题意 岛上有三个物种:剪刀$s$.石头$r$.布$p$ 其中剪刀能干掉布,布能干掉石头,石头能干掉剪刀 每天会从这三个物种中发生一场战争(也就是说其中的一个会被干掉) 问最后仅有$s/r/p$物种生存的概率 Sol 还是想复杂了啊,我列的状态时$f[i][j], g[i][j],t[i][j]$分别表示第$i$天,$j$个$s, r, p$活着的概率 然而转移了一下午也没转移出来.. 标算比我简单的多,直接设$f[i][j][k]$表示剩下$i$个$s$,$j$个$r$,$k$个$p$的概率 然

ZOJ 2949 Coins of Luck(概率dp求期望)

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1948 Luck is the key to life. When I have to decide something, I will make my decision by flipping a coin. And then, I have two things to do. First, I have the decision made. Second, I g

CF 540D Bad Luck Island

一看就是DP题(很水的一道紫题) 设\(dp[i][j][k]\)为留下\(i\)个\(r\)族的人,死去\(j\)个\(s\)族的人,死去\(k\)个\(p\)族的人的概率(跟其他的题解有点差别,但本质相同). #include <bits/stdc++.h> using namespace std; double dp[101][101][101]; int a, b, c; int main() { scanf("%d%d%d", &a, &b, &a

Codeforces 540D Bad Luck Island

http://codeforces.com/problemset/problem/540/D 题目大意: 会出石头.剪刀.布的人分别有r,s,p个,他们相互碰到的概率相同,输的人死掉,问最终活下去的人是三种类型的概率. 思路: f[i][j][k]代表i个石头,j个剪刀,k个布状态的概率,初始f[n][m][K]=1 1 #include<cstdio> 2 #include<cmath> 3 #include<algorithm> 4 #include<cstr