既然已经给std了,直接扔代码啦。代码注释还是不错哒。

因为我也有点懵,不明白的或有不同见解的一定要在评论区喷我啊!

 #include<bits/stdc++.h>
using namespace std;
//首先题意可能还有人理解错了。题目的意思是你要根据对手分别出了几个石头几个剪刀来决策
//而并不是一场战斗结束后你就能知道对方具体是谁从而直接推断剩下的人
#define g f[i][j][k]//压行,和那个题解里的含义不一样,但没有影响
#define d(x,k) for(int x=k;x>=0;--x)//压行,字少
int n;double x[][],f[][][][],ans,c[][];
//f数组的含义:当最后一维为1~3时表示第i+j+k+1个人在前面的人出了i个1,j个2,k个3的情况下出1~3的概率
//当最后一维为0时表示前i+j+k个人出了i个1,j个2,k个3的概率,即那个题解里的g数组
int main(){
scanf("%d",&n); f[][][][]=;//初始化
for(int i=;i<=n;++i) scanf("%lf%lf%lf",&x[i][],&x[i][],&x[i][]),
x[i][]/=,x[i][]/=,x[i][]/=;
//读入概率,注意顺序是132。把石头剪刀步分别抽象为123,故1胜2,2胜3,3胜1
for(int i=;i<=;++i) c[i][]=;
for(int i=;i<=;++i) for(int j=;j<=i;++j) c[i][j]+=c[i-][j-]+c[i-][j];
//杨辉三角。注意:要用到50!级别的而没有取模,所以要开long long或double
for(int s=;s<=n;++s) d(i,s) d(j,s-i) d(k,s-i-j) d(u,(i+j+k==s?:)){//有点像个背包
//你可以把s单独再开一维的数组来表示目前考虑到第几个人,更好理解但貌似会炸内存
//u为1~3时,分别枚举第几个人,前面的人出过几个1,2,3,这个人要出u
//注意u的枚举是当i+j+k!=s时才更新对方下一次出123的概率,否则只更新到达某状态的概率
//u为0时,计算到达这个状态的总概率(即题解中的g数组)
if(i)g[u]+=f[i-][j][k][u]*x[s][];//这个人s出了1,累加概率
//当u=0时,f[i][j][k][0]由f[i-1][j][k][0]转移而来(u=0并不考虑下一个人会出什么)
//在原状态出一个1即为新状态,后者的概率为x[s][1]。计算g数组就不必考虑其他f值的影响
//因为根据含义就有f[i][j][k][0]=f[i][j][k][1]+f[i][j][k][2]+f[i][j][k][3]
//当u>0时就不太一样了,计算的是接下来出1的概率
//它由上一轮对方出1的概率乘对方真的出了1的概率累加而来,此时i+j+k!=s
//因为你把这玩意当成一个背包不断往里面放对手来更新其概率
//意思大概就是“目前的状态已经是那样了而且下一轮你遇到了s”,然后s对你的概率产生的贡献
//所以就是你走到原状态的概率,乘上s出1的概率,就是s对目前状态的概率贡献
//所以i+j+k==s时不能枚举到3,因为相当于你的原状态里面已经有s个人了,可是你现在刚刚开始考虑第s个人啊
if(j)g[u]+=f[i][j-][k][u]*x[s][];//出2,同上
if(k)g[u]+=f[i][j][k-][u]*x[s][];//出3,同
if(u)g[u]+=f[i][j][k][-]*x[s][u];//不要管这个1-1,它只是为了在等宽字体下的整齐
//这个就是弥补了上面的缺陷。本层转移。不管目前的状态是什么,反正第s个人就是出u了
//与上面的并不重复。一个是在说s对以前的状态的贡献,这个是在说s对当前状态的贡献
}
d(i,n-) d(j,n--i) d(k,n-i-j-)//i+j+k不要枚举到n,因为已经进行过n轮后下一次再出什么已经不重要不记分了
ans+=max(max(g[]+*g[],g[]+*g[]),g[]+*g[])/c[n][i+j+k]/(n-i-j-k);
//在每一种状态下(即确定对手已经出了i个1,j个2,k个3)时你都有唯一确定的最优决策来进行下一轮
//每一次决策时都会累加分数,3种决策分别对应出1,2,3.g[1]即为与1打平,3*g[2]即为战胜2
//你所说的最优决策就是根据已有信息(每个对手出了什么),通过猜测对手下一步会出什么来权衡3中决策
//至于为什么用到了组合数:因为你所算的概率只是到达这一步的概率,但是你是从n个人里随便选出了c[n][i+j+k]个人
//然而其实在同一场游戏中对于同样的i+j+k你只会选1次,在计算的时候你把概率累加在一起了,现在要求一个平均值
//再除一个(n-i-j-k)的原因也差不多,因为你是要从剩下的(n-i-j-k)个人里选出一个去挑战
//这一步的概率是1/(n-i-j-k),然而你在上面5层循环的时候并没有考虑,所以在这里统一除去
printf("%.12lf\n",ans);//给的std里是用%.12f输出double的,真是惊奇
}//把注释全删掉你就会发现这个代码只有21行811B

石头剪刀步(rps):dp,概率&期望的更多相关文章

  1. [LnOI2019]加特林轮盘赌(DP,概率期望)

    [LnOI2019]加特林轮盘赌(DP,概率期望) 题目链接 题解: 首先特判掉\(p=0/1\)的情况... 先考虑如果\(k=1\)怎么做到\(n^2\)的时间复杂度 设\(f[i]\)表示有\( ...

  2. Codeforces1097D. Makoto and a Blackboard(数论+dp+概率期望)

    题目链接:传送门 题目大意: 给出一个整数n写在黑板上,每次操作会将黑板上的数(初始值为n)等概率随机替换成它的因子. 问k次操作之后,留在黑板上的数的期望. 要求结果对109+7取模,若结果不是整数 ...

  3. hdu-5781 ATM Mechine(dp+概率期望)

    题目链接: ATM Mechine Time Limit: 6000/3000 MS (Java/Others)     Memory Limit: 65536/65536 K (Java/Other ...

  4. BZOJ3566:[SHOI2014]概率充电器(树形DP,概率期望)

    Description 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品——概率充电器: “采用全新纳米级加工技术,实现元件与导线能否通电完全由真随机数决定!SHOI 概率充电器, ...

  5. hdu-5816 Hearthstone(状压dp+概率期望)

    题目链接: Hearthstone Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 65536/65536 K (Java/Other ...

  6. BZOJ4008:[HNOI2015]亚瑟王(DP,概率期望)

    Description 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑. 他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最后一战,就一定要打得漂亮.众所周知,亚瑟王是一个 ...

  7. HDU3853-LOOPS(概率DP求期望)

    LOOPS Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 125536/65536 K (Java/Others) Total Su ...

  8. 【BZOJ-1419】Red is good 概率期望DP

    1419: Red is good Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 660  Solved: 257[Submit][Status][Di ...

  9. 【POJ 2096】Collecting Bugs 概率期望dp

    题意 有s个系统,n种bug,小明每天找出一个bug,可能是任意一个系统的,可能是任意一种bug,即是某一系统的bug概率是1/s,是某一种bug概率是1/n. 求他找到s个系统的bug,n种bug, ...

随机推荐

  1. 小程序webview跳转页面后没有返回按钮完美解决方案

    随着小程序越来越火爆,使一个产品如果只有公众号H5页面和APP显得不怎么完美,总感觉不搭上小程序这趟流量车,就会少了点什么,心里别扭地很.在此驱动下,我所在公司也决定赶紧上车. 但是,如果要按照小程序 ...

  2. 《Windows内核分析》专题-索引目录

    该篇博客整理了<Windows内核分析>专题的各篇博文,方便查找. 一.保护模式 二.进程与线程 [Windows内核分析]KPCR结构体介绍 (CPU控制区 Processor Cont ...

  3. KEIL软件中编译时出现的Error L6200E: symbol multiply defined ...的解决方法

    原因:如LCD.C文件使用了bmp.h中的image[ ]变量,那么就不能将#include"bmp.h"放在LCD.H中,要将#include"bmp.h"放 ...

  4. python编程基础之十

    分支条件: 单一分支条件:if 条件 : 条件真运行... 双分支条件:if 条件 : 条件真运行else: 条件假运行... 多分支条件:if 条件1 : 条件1真运行elif 条件2 : 条件1假 ...

  5. phpstudy后门rce批量利用脚本

    写两个 一个批量检测的  一个交互式shell的 暂时py  图形化的qt写出来..有点问题 后门包 : GET / HTTP/1.1Host: 127.0.0.1User-Agent: Mozill ...

  6. [NOIp2011] luogu P1311 选择客栈

    我妈的抽象歌曲真 nb. 题目描述 给你 nnn 个点,每个点有两个参数 ci,dic_i,d_ici​,di​,给你一个数 DDD.定义一种方案合法,当且仅当你选出整数 i,j∈[1,n],i< ...

  7. Python开发【第九篇】字典

    字典 字典是一种可变的容器,可以存储任意类型的数据 字典中的每个数据都是用键进行索引,而不像序列容器(str,list,tuole)可以用整数进行索引 字典中的数据没有先后顺序,字典的存储是无序的 字 ...

  8. Python开发【第七篇】列表

    问题:当我们要用一系列数字的时候,我们需要将数字进行存储,我们就需要找个容器把数字装起来,我们需要用的时候再拿出来.如何将计算机运算的数据存储在一个地方,同时方便 对数据进行 增.删.改.查 列表 列 ...

  9. [NOIP2013提高组]华容道

    这道题第一眼看是暴力,然后发现直接暴力会TLE. 把问题转换一下:移动空格到处跑,如果空格跑到指定位置的棋子,交换位置. 这个可以设计一个状态:$[x1][y1][x2][y2]$,表示空格在$(x1 ...

  10. MyBatis 示例-简介

    简介 为了全面熟悉 MyBatis 的使用,整理一个 MyBatis 的例子,案例中包含了映射器.动态 SQL 的使用.本章先介绍项目结构和配置. 项目地址:链接 数据库表的模型关系:链接 项目结构 ...