CF398B Painting The Wall 概率期望
题意:有一个 $n * n$ 的网格,其中 $m$ 个格子上涂了色。每次随机选择一个格子涂色,允许重复涂,求让网格每一行每一列都至少有一个格子涂了色的操作次数期望。
题解:,,这种一般都要倒推才行。
设$f[i][j]$表示还有$i$行,$j$列未满足的情况下的期望次数。
因为每次选择都是完全随机,不受其他东西的影响。
所以对于题中给出的$m$,实际上就是告诉了我们要求什么东西,假设在已经有那$m$个涂色方块的情况下,我们还有$t1$行,$t2$列未满足,那么我们要求的就是$f[t1][t2]$.
那么我们可以列出转移方程:(一行写不下,分2行写)
$$f[i][j] = 1 + \frac{ij}{n ^ 2} f[i - 1][j - 1] + \frac{(n - i)j}{n ^ 2} f[i][j - 1] $$
$$f[i][j] += \frac{i(n - j)}{n ^ 2} f[i - 1][j] + \frac{(n - i)(n - j)}{n^2} f[i][j]$$
$1$是每次选择的代价,后面的就是进入每一种状态的概率,对于任意后继状态,它对当前状态的贡献就是它的期望 * 进入这个状态的概率(全期望公式)
然后移项化简,对于后面这一堆东西提出一个$\frac{1}{n ^ 2}$,然后把$f[i][j]$放到等式左边,这样就只需要在最后面除一次,可以降低一点精度误差?
$$f[i][j] = \frac{n ^ 2 + ijf[i - 1][j - 1] + (n - i)jf[i][j - 1] + i(n - j)f[i - 1][j]}{[n ^ 2 - (n - i) (n - j)]}$$
然后因为计算的时候,可能会出现为满足行或列的数量为0的情况,这种时候还放在一起计算就不太方便了(需要特判),因此考虑把这些情况单独拿出来看。
那么因为$f[i][0]$这个状态之受行的影响,所以可以看做一个优惠券收集问题,即:
$$f[i][0] = \sum_{j = 1}^{i} \frac{n}{j}$$
那么由于$$f[i - 1][0] = \sum_{j = 1}^{i - 1} \frac{n}{j}$$
可以得到关于$f[i][0]$和$f[i - 1][0]$的一个递推式,即:
$$f[i][0] = f[i - 1][0] + \frac{n}{i}$$
解释一下那个和式:如果我们现在还有$i$行未满足,共$n$行,那么选一次可以导致一行新的被满足的概率就是$\frac{i}{n}$,那么期望就为$\frac{n}{i}$.
这个东西的感性理解大概是:如果一个事件发生的概率是$\frac{1}{5}$,那么显然期望$5$天这个事件就会发生,所以期望是概率的倒数。。。
不过这个也是可以证明的,只只要将计算式列出,做一个错位相减,利用一下极限的思想,最后可以算出期望确实是概率的倒数。
#include<bits/stdc++.h>
using namespace std;
#define R register int
#define AC 2200
#define db double int n, m, l, r;
double f[AC][AC];
bool zl[AC], zr[AC];//表示第i行or第i列有没有被标记 inline int read()
{
int x = ;char c = getchar();
while(c > '' || c < '') c = getchar();
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x;
} void pre()
{
n = l = r = read(), m = read();
for(R i = ; i <= m; i ++)
{
int x = read(), y = read();
if(!zl[x]) zl[x] = true, -- l;
if(!zr[y]) zr[y] = true, -- r;
}
} double cal(double x, double y){
return x / y;
} void work()
{//因为把i or j为0的状态放在下面一起枚举不太方便(要特判),所以在前面单独求
for(R i = ; i <= n; i ++)//
{
f[i][] = f[i - ][] + (double)n / i;//因为这个时候只有行的影响,所以只需要考虑行,那么就相当于一个购物券收集问题
f[][i] = f[][i - ] + (double)n / i;
}
for(R i = ; i <= l; i ++)
for(R j = ; j <= r; j ++)
{
/*f[i][j] = 1;
f[i][j] += cal(i * j, n * n) * f[i - 1][j - 1];
f[i][j] += cal((n - i) * j, n * n) * f[i][j - 1];
f[i][j] += cal(i * (n - j), n * n) * f[i - 1][j];
f[i][j] /= 1 - cal((n - i) * (n - j), n * n);*/
f[i][j] = n * n;//把除法放在最后以降低精度误差
f[i][j] += i * j * f[i - ][j - ];
f[i][j] += (n - i) * j * f[i][j - ];
f[i][j] += i * (n - j) * f[i - ][j];
f[i][j] /= n * n - (n - i) * (n - j);
}
printf("%.10lf\n", f[l][r]);
} int main()
{
freopen("in.in", "r", stdin);
pre();
work();
fclose(stdin);
return ;
}
CF398B Painting The Wall 概率期望的更多相关文章
- 【CF398B】B. Painting The Wall(期望)
B. Painting The Wall time limit per test 1 second memory limit per test 256 megabytes input standard ...
- Codeforces Round #233 (Div. 2)D. Painting The Wall 概率DP
D. Painting The Wall ...
- [Codefoeces398B]Painting The Wall(概率DP)
题目大意:一个$n\times n$的棋盘,其中有$m$个格子已经被染色,执行一次染色操作(无论选择的格子是否已被染色)消耗一个单位时间,染色时选中每个格子的概率均等,求使每一行.每一列都存在被染色的 ...
- Painting The Wall 期望DP Codeforces 398_B
B. Painting The Wall time limit per test 1 second memory limit per test 256 megabytes input standard ...
- 【BZOJ-1419】Red is good 概率期望DP
1419: Red is good Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 660 Solved: 257[Submit][Status][Di ...
- uvalive 7331 Hovering Hornet 半平面交+概率期望
题意:一个骰子在一个人正方形内,蜜蜂在任意一个位置可以出现,问看到点数的期望. 思路:半平面交+概率期望 #include<cstdio> #include<cstring> ...
- OI队内测试一【数论概率期望】
版权声明:未经本人允许,擅自转载,一旦发现将严肃处理,情节严重者,将追究法律责任! 序:代码部分待更[因为在家写博客,代码保存在机房] 测试分数:110 本应分数:160 改完分数:200 T1: 题 ...
- 2016 多校联赛7 Balls and Boxes(概率期望)
Mr. Chopsticks is interested in random phenomena, and he conducts an experiment to study randomness. ...
- 牛客网多校赛第9场 E-Music Game【概率期望】【逆元】
链接:https://www.nowcoder.com/acm/contest/147/E 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524 ...
随机推荐
- [WC2010]重建计划 长链剖分
[WC2010]重建计划 LG传送门 又一道长链剖分好题. 这题写点分治的人应该比较多吧,但是我太菜了,只会长链剖分. 如果你还不会长链剖分的基本操作,可以看看我的长链剖分总结. 首先一看求平均值最大 ...
- Mysql 开启Federated引擎的方法
原文参考:http://www.thinksaas.cn/topics/0/63/63532.html 进入mysql命令行,没有看到Federated,说明没有安装 mysql>show en ...
- 一个web应用的诞生(12)--再探首页
就要面对本章的一个难点了,说是难点可能仅仅对于我来说,毕竟我是一个js渣,既然首页打算使用动态加载的形式,那么与后台交互的方式就要进行选择,目前比较流行的为RESTful的形式,关于RESTful的文 ...
- P,V操作及同步互斥实例
无论是计算机考研.计算机软件水平考试.计算机操作系统期末考试还是其他计算机岗位考试,P.V原语操作都是一个常考点.下面笔者总结了关于P.V操作的一些知识. 信号量是最早出现的用来解决进程同步与互斥问题 ...
- Just a Hook:线段树+区间修改
E - Just a Hook In the game of DotA, Pudge’s meat hook is actually the most horrible thing for most ...
- 福利,一张图看懂IT售前工程师修炼之道
职场中的新人如何自我定位? 如何深刻理解IT售前这个职位? 如何从IT售前菜鸟成长为IT售前专家? 推荐这本书<IT售前工程师修炼之道> 本书精华内容 售前的重要性 售前要有逻辑能力 售前 ...
- 两张神图介绍python3和 2.x与 3.x 的区别
有感与第一张图, 做了第二张图.
- Scrum立会报告+燃尽图(十一月十五日总第二十三次):代码规范与技术交流
此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2384 项目地址:https://git.coding.net/zhang ...
- "Hello World"团队召开的第三周第七次会议
今天是我们团队“Hello World!”团队召开的第三周的第七次会议.博客内容: 一.会议时间 二.会议地点 三.会议成员 四.会议内容 五.Todo List 六.会议照片 七.燃尽图 一.会议时 ...
- 20172326『Java程序设计』课程结对编程练习_四则运算第二周阶段总结
20172326『Java程序设计』课程结对编程练习_四则运算第二周阶段总结 小组成员 20172313 余坤澎 20172332 于欣月 20172326 康皓越 小组编程照片 设计思路 通过一个E ...