【BZOJ-1426】收集邮票 概率与期望DP
1426: 收集邮票
Time Limit: 1 Sec Memory Limit: 162 MB
Submit: 261 Solved: 209
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
Sample Output
HINT
Source
Solution
第一次见概率题这么做的...好厉害
首先我们定义$g[i]$表示现在有$i$张,要买到$n$张的期望次数;
定义$P(x,i)$为买$x$次能从$i$种买到$n$种的概率。
那么可以得到:
$$g[i]=\sum _{x=0}^{\infty }x*P(x,i)$$
那么就有:
$$g[i]=g[i]*\frac{i}{n}+g[i+1]*\frac{n-i}{n}+1$$
$$g[i]-g[i]*\frac{i}{n}=g[i+1]*\frac{n-i}{n}+1$$
$$g[i]*\frac{n-i}{n}=g[i+1]*\frac{n-i}{n}+1$$
$$g[i]=(g[i+1]*\frac{n-i}{n}+1)*\frac{n}{n-i}$$
得到$g[i]=g[i+1]+\frac{n}{n-i}$ ,且知道$g[n]=0$
那么我们设$f[i][j]$表示还现在有$i$张,下一张是$j$元,买到$n$张的期望
显然$f[i][j]$到$f[i][j+1]$的概率是$\frac{i}{n}$,到$f[i+1][j+1]$的概率是$\frac{n-i}{n}$,并且付出的代价都是$j$
所以转移显然:
$$f[i][j]=\frac{i}{n}*f[i][j+1]+\frac{n-i}{n}*f[i+1][j+1]+j$$
但是$f[i][j]$是的递推是无穷大的,所以不能直接递推,考虑它的一些性质:
$$f[i][j]=\sum_{x=0}^{\infty }[j+(j+1)+...+(x+j-1)]*P(x,i)$$
显然是个等差数列求和,所以可以得到:
$$f[i][j]=\sum _{x=0}^{\infty }\frac{x*[(j)+(x+j-1)]}{2}*P(x,i)$$
然后我们作差$f[i][j+1]-f[i][j]$得到:
$$f[i][j+1]-f[i][j]=\sum_{x=0}^{\infty}x*P(x,i) \Leftrightarrow f[i][j+1]-f[i][j]=g[i]$$
所以我们就可以对开始时$f[i][j]$这个式子进行化简,得到:
$$f[i][j]=f[i][j+1]*\frac{i}{n}+f[i+1][j+1]*\frac{n-i}{n}$$
$$\Rightarrow f[i][j]=(f[i][j]+g[i])*\frac{i}{n}+(f[i+1][j]+g[i+1])*\frac{n-i}{n}+j$$
$$f[i][j]=\frac{[(f[i+1][j]+g[i+1])*\frac{n-i}{n}+g[i]*\frac{i}{n}+j]*n}{n-i}$$
然后我们发现$j$这一维其实是无效的,我们只需要知道$j=1$时的答案,所以我们在转移的时候忽略它,直接令$j=1$,并用$f[i]$表示$f[i][1]$,得到:
$$f[i]=f[i+1]+g[i+1]+g[i]*\frac{i}{n-i}+\frac{n}{n-i}$$
然后我们就可以线性时间得到答案了。
Code
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
#define MAXN 10010
int N;
double g[MAXN],f[MAXN];
int main()
{
scanf("%d",&N);
for (int i=N-1; i>=0; i--) g[i]=g[i+1]+1.0*N/(N-i);
for (int i=N-1; i>=0; i--) f[i]=f[i+1]+g[i+1]+g[i]*1.0*i/(N-i)+1.0*N/(N-i);
printf("%.2lf\n",f[0]);
}
码量比思路量不知道小到哪去了!!
【BZOJ-1426】收集邮票 概率与期望DP的更多相关文章
- BZOJ 1426--收集邮票(概率与期望&DP)
1426: 收集邮票 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 504 Solved: 417[Submit][Status][Discuss] ...
- BZOJ 1426 收集邮票 ——概率DP
$f(i)$表示现在有$i$张,买到$n$张的期望 所以$f(i)=f(i+1)+\frac {n}{n-i}$ 费用提前计算,每张邮票看做一元,然后使后面每一张加1元 $g(i)$表示当前为$i$张 ...
- BZOJ 1426: 收集邮票 数学期望 + DP
Description 有n种不同的邮票,皮皮想收集所有种类的邮票.唯一的收集方法是到同学凡凡那里购买,每次只能买一张,并且 买到的邮票究竟是n种邮票中的哪一种是等概率的,概率均为1/n.但是由于凡凡 ...
- BZOJ 1426: 收集邮票 [DP 期望 平方]
传送门 题意: 有n种不同的邮票,皮皮想收集所有种类的邮票.唯一的收集方法是到同学凡凡那里购买,每次只能买一张,并且买到的邮票究竟是n种邮票中的哪一种是等概率的,概率均为1/n.但是由于凡凡也很喜欢邮 ...
- bzoj 1426: 收集邮票【期望dp】
我太菜了,看的hzwer的blog才懂 大概是设f[i]表示已经拥有了i张邮票后期望还要买的邮票数,这个转移比较简单是f[i]=f[i]*(i/n)+f[i+1]*((n-i)/n)+1 然后设g[i ...
- bzoj 1426:收集邮票 求平方的期望
显然如果收集了k天,ans=k*(k+1)/2=(k^2+k)/2.那么现在要求的就是这个东西的期望. 设f[i]表示已有i张邮票,收集到n张的期望次数,g[i]表示已有i张邮票,收集到n张的次数的平 ...
- bzoj 1426 收集邮票
f[i]:当前已拥有i种邮票,还需要买的邮票数的期望值. g[i]:当前已拥有i种邮票,还需要的钱的期望值. 每张邮票初始都是1元钱,每买一张邮票,还没购买的邮票每张都涨价1元. f[i]=1+(n ...
- 收集邮票 (概率dp)
收集邮票 (概率dp) 题目描述 有 \(n\) 种不同的邮票,皮皮想收集所有种类的邮票.唯一的收集方法是到同学凡凡那里购买,每次只能买一张,并且买到的邮票究竟是 \(n\) 种邮票中的哪一种是等概率 ...
- 【算法学习笔记】概率与期望DP
本文学习自 Sengxian 学长的博客 之前也在CF上写了一些概率DP的题并做过总结 建议阅读完本文再去接着阅读这篇文章:Here 前言 单纯只用到概率的题并不是很多,从现有的 OI/ACM 比赛中 ...
随机推荐
- js 调试
$(":select[name='start_Month'").each(function(item,i){ console.log(item.name + "" ...
- js判断鼠标是否停止移动
本程序实现当鼠标在一个特定的div内悬停n秒时,判断出已经停止移动. 思路: 1.定义全局变量鼠标移动状态imouse,定时器timer.当鼠标在div内移动时,imouse值为1,相反静止时值为0: ...
- 基于Flume+LOG4J+Kafka的日志采集架构方案
本文将会介绍如何使用 Flume.log4j.Kafka进行规范的日志采集. Flume 基本概念 Flume是一个完善.强大的日志采集工具,关于它的配置,在网上有很多现成的例子和资料,这里仅做简单说 ...
- 人工智能与3A
我在Tid2014上的一个小视频: 下一代的码农会是什么样的呢?且听咕咚老王的“3A”畅谈——“Ai.Art.Any”. 在艺术的视角下,世界是沉寂的.美丽的: 在码农的眼中,世界是有“码”的朦胧美吗 ...
- Linux 硬盘分区生效命令partprobe
在Linux中使用fdisk命令进行分区时,有时会遇到"WARNING: Re-reading the partition table failed with error 16: Devic ...
- ORACLE参数max_shared_servers空值与零的区别
ORACLE数据库中的参数max_shared_servers,这是一个DBA很熟悉的参数,但是这个参数max_shared_servers为空值与为0有区别吗?这个细节可能很多人都没有注意过.如下所 ...
- MySQL数据库
1.1 数据库的发展史 1.1.1 萌芽阶段--文件系统 文件系统 1.1.2 第一代数据库--层次模型.网状模型 1.1.2.1层次模型 这是一种导航结构,导航结构的优点:分类管理:导航结构的缺点: ...
- jquery $.trim()去除字符串空格详解
jquery $.trim()去除字符串空格详解 语法 jQuery.trim()函数用于去除字符串两端的空白字符. 作用 该函数可以去除字符串开始和末尾两端的空白字符(直到遇到第一个非空白字符串为止 ...
- 业务监控-指标监控(v1)
最近做了指标监控系统的后台,包括需求调研.代码coding.调试调优测试等,穿插其他杂事等前后花了一个月左右. 指标监控指的是用户通过接口上传某些指标信息,并且通过配置阈值公式和告警规则等信息监测自己 ...
- C语言猜拳游戏
2016年最后一篇文章 今天闲来无事Google了一段C语言写的猜拳游戏的代码(本人水平比较低,几乎是刚入门),我没做什么修改.这个switch语句里面对result的处理让我眼前一新,原来是这么玩的 ...