洛谷 P4550 收集邮票 - 期望DP
洛谷 P4550 收集邮票
题目链接:洛谷 P4550 收集邮票
算法标签: 动态规划(DP)
、期望DP
题目
题目描述
有n种不同的邮票,皮皮想收集所有种类的邮票。唯一的收集方法是到同学凡凡那里购买,每次只能买一张,并且买到的邮票究竟是n种邮票中的哪一种是等概率的,概率均为1/n。但是由于凡凡也很喜欢邮票,所以皮皮购买第k张邮票需要支付k元钱。
现在皮皮手中没有邮票,皮皮想知道自己得到所有种类的邮票需要花费的钱数目的期望。
输入格式
一行,一个数字N
N<=10000
输出格式
要付出多少钱.
保留二位小数
输入输出样例
输入 #1
3
输出 #1
21.25
题解:
期望DP
按照题目的描述,我们可以设一个\(f[]\)和一个\(g[]\)
\(f[i]\)表示买到第\(i\)张邮票还需要购买的期望次数
\(g[i]\)表示买到第\(i\)张邮票还需要期望花费的钱数。
讲到这里大概就可以发现,这道题需要逆推。
对于一个\(f[i]\),我们也可以有以下的几种方案:
会买到重复邮票的概率为\(\frac{i}{n}\),所以这项贡献:\(f[i] \times \frac{i}{n}\)
会买到不同邮票的概率为\(\frac{n - i}{n}\),所以这项贡献:\(f[i+1] \times \frac{n-i}{n}\)
买当前邮票,贡献为:\(1\)。
所以对于一个\(f[i]\),我们可以得出:\(f[i]=f[i] \times \frac{i}{n} + f[i+1] \times \frac{n-i}{n}+1\)。
化简得出:\(f[i] = f[i + 1] + \frac{n}{n-i} \dots \ ①\)
那么对于\(g[i]\),推导的方式大致与\(f[i]\)类似:
\(g[i] = (f[i]+g[i]+1) \times \frac{i}{n}+(f[i+1]+g[i+1]+1)\times\frac{n-i}{n}\)
化简得出:\(g[i]=\frac{i}{n-i}\times f[i]+f[i+1]+g[i+1]+\frac{n}{n-i} \dots \ ②\)
至此,两个必要的递推式都推导完毕,接下来就是注意好double的处理,输入和输出,计算等等即可。
AC代码
#include <bits/stdc++.h>
using namespace std;
const int N = 10010;
int n;
double f[N], g[N];
double _div(int a, int b)
{
return a * 1.00 / b * 1.00;
}
int main()
{
scanf("%d", &n);
f[n] = g[n] = 0;
for (int i = n - 1; i >= 0; i -- )
{
f[i] = f[i + 1] + _div(n, n - i);
g[i] = _div(i, n - i) * f[i] + f[i + 1] + g[i + 1] + _div(n, n - i);
}
printf("%.2lf", g[0]);
}
原文地址:https://www.cnblogs.com/littleseven777/p/11851753.html
- 【Java学习笔记之十二】Java8增强的工具类:Arrays的用法整理总结
- 利用insert,update和delete注入获取数据
- 【机器学习笔记之二】决策树的python实现
- 【Java学习笔记之十三】初探Java面向对象的过程及代码实现
- 洛谷 P1308 统计单词数【字符串+模拟】
- 【Java学习笔记之十四】Java中this用法小节
- Codeforces 839E Mother of Dragons【__builtin_popcount()的使用】
- 【Java学习笔记之十五】Java中的static关键字解析
- Codeforces 839D Winter is here【数学:容斥原理】
- Codeforces 839C Journey【DFS】
- Facebook的漏洞可以让攻击者在分分钟内重置用户账户密码
- 【Java学习笔记之十七】Java中普通代码块,构造代码块,静态代码块区别及代码示例分析
- 【机器学习笔记之六】Bagging 简述
- 洛谷 P1553 数字反转(升级版)【字符串+STL stack】
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android 客户端RSA加密的实现方法
- Android圆形头像拍照后“无法加载此图片”的问题解决方法(适配Android7.0)
- Android 中Failed to read key from keystore解决办法
- Android圆角按钮的制作方法
- Android计时器控件Chronometer应用实例
- Android 中利用 ksoap2 调用 WebService的示例代码
- Android自定义View展示Wifi信号强弱指示方法示例
- android事件分发机制的实现原理
- Android 在子线程中更新UI的几种方法示例
- WebView设置WebViewClient的方法
- Android星级评分条的实现代码
- Android模仿美团顶部的滑动菜单实例代码
- android实现按钮获取焦点延迟加载
- Devtools 老师傅养成[1] - Chrome Devtools介绍
- Android4.4开发之电池低电量告警提示原理与实现方法分析