题目传送门(内部题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. Python笔记(二十四)_魔法方法_运算符的魔法方法

    算数运算方法 .反运算方法 以对象A+对象B为例,都是将A作为self值,而B作为other值传入__add__(self,other)方法: 当用户输入A+B,就会调用重写的add方法: >& ...

  2. 【SD系列】SAP 查看销售订单时,报了一个错误消息,“项目不符合计划行(程序错误)”

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[SD系列]SAP 查看销售订单时,报了一个错误 ...

  3. 浅谈Java反射机制 之 获取类的 方法 和 属性(包括构造函数)

    上一篇 获取 类 的字节码文件 我们讲到了获取类的字节码文件的三种方法 第三种方法通过getClass("全路径名")获取字节码文件最符合要求 1.获取构造方法 先贴上我们要获取的 ...

  4. [Udemy] ES 7 and Elastic Stack - part 1

    Section 1 基本概念: Index(indices) 相当于 关系型数据库的 table, document 相当于关系型数据库的 row,  还有一个type的概念(可以理解为table的s ...

  5. [开发技巧]·如何让离线安装Python包

    [开发技巧]·如何让离线安装Python包 1.问题描述 PyPI(Python Package Index)是python官方的第三方库的仓库,所有人都可以下载第三方库或上传自己开发的库到PyPI. ...

  6. static定义属性

    static关键字在Java程序开发过程中主要进行属性和方法的定义. static 定义属性: 类中的最主要的组成就是属性和方法,那么在说static之前,先看看一下问题: 范例:定义一个描述球的信息 ...

  7. dom元素的自上而下自动滚动

    dom元素的自上而下自动滚动 <!doctype html> <html lang="en"> <head> <meta charset= ...

  8. Node.js实战13:fs模块奥义!开发一个数据库。

    本文,将使用fs开发一种简单的文件型数据库. 数据库中,记录将采用JSON模式,内容型如: {"key":"a","value":" ...

  9. .NET MVC Json()处理大数据异常解决方法

    [1-部分原文]: .NET MVC Json()处理大数据异常解决方法 整个项目采用微软的ASP.NET MVC3进行开发,前端显示采用EasyUI框架,图表的显示用的是Highcharts,主要进 ...

  10. UVA-10462.Is There A Second Way Left(Kruskal+次小生成树)

    题目链接 本题大意:这道题用Kruskal较为容易 参考代码: #include <cstdio> #include <cstring> #include <vector ...