博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SP1026 FAVDICE - Favorite Dice 数学期望
阅读量:4597 次
发布时间:2019-06-09

本文共 955 字,大约阅读时间需要 3 分钟。

题目描述:
一个n面的骰子,求期望掷几次能使得每一面都被掷到。
题解:
先谈一下期望DP.
一般地,如果终止状态固定,我们都会选择逆序计算.
很多题目如果顺序计算会出现有分母为 0 的情况,而逆序计算中则不会出现.
比如,对于本题,我们设状态 $F_{i}$ 表示当前已翻过 $i$ 种不同的面,为了翻完每个面还需要额外翻的期望次数.
终止状态: $F_{n}=0$ 
考虑枚举到 $F_{i}$ ,那么当前翻到的面有两种可能.
$1.$ 先前被翻过,那么该概率是 $P_{1}=\frac{i}{n}$,还需翻的次数为 $tot_{1}=1+F_{i}$ .
$2.$ 先前未被翻过,概率为 $P_{2}=\frac{n-i}{n}$,次数为 $tot_{2}=F_{i+1}+1$.
列等式:
$F_{i}=P_{1}\times tot_{1}+P_{2}\times tot_{2}$ .
带入,化简得 $F_{i}=\frac{n}{n-i}+F_{i+1}$ 

Code:

#include 
#define setIO(s) freopen(s".in","r",stdin) #define maxn 20000 using namespace std;double F[maxn]; int main(){ // setIO("input"); int T; scanf("%d",&T); while(T--) { int n; scanf("%d",&n); F[n] = 0.00; for(int i = n - 1; i >= 0; --i) { F[i] = (double)1.0*(1.0*n/(n-i)*1.0) + F[i + 1]; } printf("%.2f\n",F[0]); } return 0; }

  

转载于:https://www.cnblogs.com/guangheli/p/9930852.html

你可能感兴趣的文章
如何建立合适的索引?
查看>>
acwing 651. 逛画展
查看>>
(待完成)qbxt2019.05 总结12 - 趣味题目 鹰蛋
查看>>
[2018/11/18] Java数据结构(2) 简单排序 冒泡排序 选择排序 插入排序
查看>>
关于WPF程序只运行一个实例的方法
查看>>
游标的使用
查看>>
图论:点分治
查看>>
mysql
查看>>
C/C++ 知识点---sizeof使用规则及陷阱分析(网摘)
查看>>
java小程序 示例
查看>>
前端开发在线小工具
查看>>
有关cookies使用方法
查看>>
Hadoop 使用Combiner提高Map/Reduce程序效率
查看>>
前言 转录组
查看>>
扫描图片怎么转换成文字
查看>>
easyui刷新渲染
查看>>
kindeditor 引用js架包问题
查看>>
POJ 1743 Musical Theme (后缀数组,求最长不重叠重复子串)(转)
查看>>
js中的delete
查看>>
centos 安装jenkins
查看>>