【链接】 我是链接,点我呀:)

【题意】

剪刀、石头、布各有r,s,p个生活在同一个村子里。
它们两两之间相遇的几率都相同(相遇后就会按照划拳的规则判断输赢,输的人就死掉了)。
问你最后只剩下剪刀,只剩下石头、只剩下布活着的概率。

【题解】

动态规划
如果从输赢方面去考虑的话很难找到解。
设f[i][j][k]表示石头,剪刀,布分别剩下i,j,k只活着的概率。
显然有i*j+i*k+j*k种可能。
而(i,j,k)这个状态,变成(i-1,j,k)这个状态,显然就是石头的个数减少1了。
那么就是石头遇到了布,也即其中的i*k种可能。
那么从(i,j,k)转移到(i-1,j,k)这个过程,就是f[i][j][k]*转移的概率。其中转移的概率=$\frac{i*k}{i*j+i*k+j*k}$
其他的转移同理
最后ans1 = f[i][0][0] ans2 = f[0][i][0] ans3 = f[0][0][i];

【代码】

#include <bits/stdc++.h>
using namespace std; const int N = 100; int r,s,p;
double f[N+10][N+10][N+10]; int main(){
#ifdef LOCAL_DEFINE
freopen("rush_in.txt", "rt", stdin);
#endif
scanf("%d%d%d",&r,&s,&p);
f[r][s][p] = 1;
for (int i = r;i >= 0;i--)
for (int j = s;j >= 0;j--)
for (int k = p;k >= 0;k--){
double temp = i*j + i*k + j*k;
if (i*j==0 && i*k==0 && j*k==0) continue;
if (i) f[i-1][j][k] += f[i][j][k]*((1.0*i*k)/temp);
if (j) f[i][j-1][k] += f[i][j][k]*((1.0*i*j)/temp);
if (k) f[i][j][k-1] += f[i][j][k]*((1.0*j*k)/temp);
}
double ans1 = 0,ans2 = 0,ans3 = 0;
for (int i = 1;i <= r;i++) ans1+=f[i][0][0];
for (int i = 1;i <= s;i++) ans2+=f[0][i][0];
for (int i = 1;i <= p;i++) ans3+=f[0][0][i];
printf("%.12f %.12f %.12f\n",ans1,ans2,ans3);
return 0;
}

最新文章

  1. Appium 三种wait方法(appium 学习之改造轮子)
  2. git tag查看、创建与删除
  3. LeetCode128:Longest Consecutive Sequence
  4. win7刷新图标缓存
  5. linux 系统安装 mysql
  6. 2_JavaScript日期格式化
  7. xceed wpf datagrid
  8. HP-UX磁带备份错误收集
  9. nginx sendfile tcp_nopush tcp_nodelay参数解释
  10. cocoapods卸载重装 解决clone,install,search很慢的问题
  11. 使用 LitJson 解析Json并读取数据
  12. python爬取百度贴吧帖子
  13. 转:Python语言编程学习资料(电子书+视频教程)下载汇总
  14. 遍历所有子物体中renderer(渲染器)中的material(材质)
  15. 开源.NET界面库
  16. CSS- 文本超出指定宽度后隐藏并显示为省略号
  17. 【bzoj3064】Tyvj 1518 CPU监控 线段树维护历史最值
  18. beego学习笔记(4):开发文档阅读(3)
  19. windows phone 应用提交商店失败总结
  20. direct2d封装

热门文章

  1. ajax如何上传文件(整理)
  2. mysql查询最新一组数据
  3. 高速入手ITOO导入-改进导入.xlsx格式
  4. Centos6.4安装opennebula
  5. gullo.me 的 natvps
  6. libev环境
  7. 使用gnu automake编译helloworld
  8. worktools-git 工具的使用总结(3)
  9. 24.Node.js Stream(流)
  10. Java学习笔记三.3