题目传送门(内部题9)


输入格式

第一行一个整数$n$。接下来$n$行每行$3$个非负整数$r_i,p_i,s_i$。


输出格式

一行一个实数表示答案。当你的答案与标准答案的绝对或相对误差不超过${10}^{-9}$时判为正确。


样例

样例输入:

3
300 0 0
0 300 0
0 0 300

样例输出:

6.333333333333


数据范围与提示

对于$10%$的数据,$n=1$。
对于$30%$的数据,$n\leqslant 10$。
对于另外$10%$的数据,所有$r_i$均相等,所有$p_i$均相等。
对于又另外$30%$的数据,$r_i=0$。
对于$100%$的数据,$1\leqslant n\leqslant 50$,$r_i+p_i+s_i=300$。


题解

首先,这道题是一道假期望。

用$g[i][j][k]$表示第$i+j+k$轮出了$i$个石头,$j$个剪刀,$k$个布的概率。

用$dp[i][j][k][l]$表示前$i+j+k$轮出了$i$个石头,$j$个剪刀,$k$个布的概率。

注意我们不是在$dp[i][j][k][x]$中取$\max$,而是在$dp[i][j][k][x]+dp[i][j][k][x+1]\times 3$中取$\max$。

$g[i][j][k]$也非常好求,直接给出式子:$g[i][j][k]=g[i-1][j][k]\times r[t]+g[i][j-1][k]\times s[t]+g[i][j][k-1]\times p[t]$。

注意$dp$和$g$的意义,所以对$g$的转移需要在$dp$之后。

还有就是注意输入顺序是:石头、布、剪刀,即可。

时间复杂度:$\Theta(n^4)$。

期望的分:$100$分。

实际的分:$100$分。


代码时刻

#include<bits/stdc++.h>
using namespace std;
int n;
long double w[100],z[100],c[100];
long double C[51][51];
long double g[51][51][51],dp1[51][51][51],dp2[51][51][51],dp3[51][51][51];
long double ans;
int main()
{
scanf("%d",&n);
for(int i=0;i<=n;i++)
{
C[i][0]=1.0;
for(int j=1;j<=i;j++)
C[i][j]=C[i-1][j]+C[i-1][j-1];
}
for(int i=1;i<=n;i++)
{
cin>>w[i]>>c[i]>>z[i];//注意输入顺序
w[i]/=300.0;
z[i]/=300.0;
c[i]/=300.0;
}
g[0][0][0]=1.0;
for(int t=1;t<=n;t++)
for(int i=t;~i;i--)
for(int j=t-i;~j;j--)
for(int k=t-i-j;~k;k--)
{
if(i+j+k!=t)
{
if(i)dp1[i][j][k]+=dp1[i-1][j][k]*w[t];
if(j)dp1[i][j][k]+=dp1[i][j-1][k]*z[t];
if(k)dp1[i][j][k]+=dp1[i][j][k-1]*c[t];
dp1[i][j][k]+=g[i][j][k]*w[t];
if(i)dp2[i][j][k]+=dp2[i-1][j][k]*w[t];
if(j)dp2[i][j][k]+=dp2[i][j-1][k]*z[t];
if(k)dp2[i][j][k]+=dp2[i][j][k-1]*c[t];
dp2[i][j][k]+=g[i][j][k]*z[t];
if(i)dp3[i][j][k]+=dp3[i-1][j][k]*w[t];
if(j)dp3[i][j][k]+=dp3[i][j-1][k]*z[t];
if(k)dp3[i][j][k]+=dp3[i][j][k-1]*c[t];
dp3[i][j][k]+=g[i][j][k]*c[t];
}
if(i)g[i][j][k]+=g[i-1][j][k]*w[t];
if(j)g[i][j][k]+=g[i][j-1][k]*z[t];
if(k)g[i][j][k]+=g[i][j][k-1]*c[t];
}
for(int i=0;i<n;i++)
for(int j=0;i+j<n;j++)
for(int k=0;i+j+k<n;k++)
ans+=max(dp1[i][j][k]+3.0*dp2[i][j][k],max(dp2[i][j][k]+3.0*dp3[i][j][k],dp3[i][j][k]+3.0*dp1[i][j][k]))/(C[n][i+j+k]*(n-i-j-k));
cout<<fixed<<setprecision(12)<<ans<<endl;
return 0;
}

rp++

[CSP-S模拟测试]:石头剪刀布(rps)(概率DP)的更多相关文章

  1. [CSP-S模拟测试]:玩具(概率DP)

    题目描述 这个故事发生在很久以前,在$IcePrincess\text{_}1968$和$IcePrince\text{_}1968$都还在上幼儿园的时候. $IcePrince\text{_}196 ...

  2. [CSP-S模拟测试]:Seat(概率DP+数学)

    题目描述 有$n+2$个座位等距地排成一排,从左到右编号为$0$至$n+1$.最开始时$0$号以及$n+1$号座位上已经坐了一个小$G$,接下来会有$n$个小$G$依次找一个空座位坐下.由于小$G$们 ...

  3. [CSP-S模拟测试]:B(期望DP)

    题目传送门(内部题151) 输入格式 第一行一个整数$N$. 第二行$N$个整数,第$i$个为$a_i$. 输出格式 一行一个整数,表示答案.为避免精度误差,答案对$323232323$取模. 即设答 ...

  4. [CSP-S模拟测试]:赤壁情(DP)

    前赤壁赋 壬戌之秋,七月既望,苏子与客泛舟游于赤壁之下.清风徐来,水波不兴.举酒属客,诵明月之诗,歌窈窕之章.少焉,月出于东山之上,徘徊于斗牛之间.白露横江,水光接天.纵一苇之所如,凌万顷之茫然.浩浩 ...

  5. [CSP-S模拟测试]:chemistry(期望DP+组合数学)

    题目传送门(内部题27) 输入格式 第一行有$4$个整数$n,k,p,q$.第二行有$n$个整数$a_i$.接下来有$n-1$行,每行有两个整数$u,v$,表示$u$与$v$之间通过化学单键连接. 输 ...

  6. [CSP-S模拟测试]:走路(期望DP+分治消元)

    题目传送门(内部题100) 输入格式 第一行两个整数$n,m$,接下来$m$行每行两个整数$u,v$表示一条$u$连向$v$的边.不保证没有重边和自环. 输出格式 $n-1$行每行一个整数,第$i$行 ...

  7. [CSP-S模拟测试]:密码(数位DP+库默尔定理)

    题目描述 为了揭穿$SERN$的阴谋,$Itaru$黑进了$SERN$的网络系统.然而,想要完全控制$SERN$,还需要知道管理员密码.$Itaru$从截获的信息中发现,$SERN$的管理员密码是两个 ...

  8. [CSP-S模拟测试]:硬币(博弈论+DP+拓展域并查集)

    题目传送门(内部题135) 输入格式 第一行包含一个整数$T$,表示数据组数. 对于每组数据,第一行两个整数$h,w$,表示棋盘大小. 接下来$h$行,每行一个长度为$w$的字符串,每个位置由为$o, ...

  9. [CSP-S模拟测试]:军训队列(DP+乱搞)

    题目描述 有$n$名学生参加军训,军训的一大重要内容就是走队列,而一个队列的不规整程度是该队中最高的学生的身高与最矮的学生的身高差值的平方.现在要将$n$名参加军训的学生重新分成$k$个队列,每个队列 ...

随机推荐

  1. 06 使用bbed提交delete的数据--01

    使用bbed模拟delete提交操作 --session 1 TEST@ orcl )); Table created. TEST@ orcl ,'AAAAA'); row created. TEST ...

  2. Java 实现Excel的简单读取操作

    JAVA实现Excel表单的简单读取操作 实现Excel表单的简单读取操作,首先要导入相关的jar包: 如图所示: 此处贴上代码: public static List<List<Stri ...

  3. vuejs基础-MVVM结构

    Vue.js 基本代码 和 MVVM 之间的对应关系 处理过程: 每当用户进行业务处理时,如果需要进行业务处理,都会通过网络请求,去请求后端的服务器,此时,我们的这个请求,就会被后端的App.js监听 ...

  4. pyhton常用快捷键

    常用快捷键 快捷键 功能 Ctrl + Q 快速查看文档 Ctrl + F1 显示错误描述或警告信息 Ctrl + / 行注释(可选中多行) Ctrl + Alt + L 代码格式化 Ctrl + A ...

  5. python学习笔记(12):高级面向对象

    一.__slots__和property 1.__slots__魔术函数动态的添加方法和属性 2.直接暴露属性的局限性 3.使用get/set方法 4.利用@property简化get/set方法 5 ...

  6. 用Nginx代理请求,处理前后端跨域

    自从前端spa框架出现后,都是前后端分离开发了.我们在开发的时候难免会遇到跨域的问题.跨域这种问题解决的方法基本都是在服务端实现的.以java为例,我知道的有3种方法处理跨域: 1.使用 @Cross ...

  7. 自定义、操作cookie

    /** * 读取所有cookie * 注意二.从客户端读取Cookie时,包括maxAge在内的其他属性都是不可读的,也不会被提交.浏览器提交Cookie时只会提交name与value属性.maxAg ...

  8. 2018-8-10-cant-found-Microsoft.VSSDK.BuildTools.15.0.26201

    title author date CreateTime categories cant found Microsoft.VSSDK.BuildTools.15.0.26201 lindexi 201 ...

  9. linux Sersync 参数说明

    Sersync 的可选功能是通过 xml 配置文件来实现的,下面来为大家解释该文件! 在该文件中,使用<!--中间是注释内容-->的方式去注释信息,注意不是我们平时# [root@SERS ...

  10. LINUX VSFTP配置及安装

    ------------------转载:亲身实践,确实好用(http://www.cnblogs.com/jack-Star/p/4089547.html) 1.VSFTP简介 VSFTP是一个基于 ...