题意

有\(n\)场比赛,他每次等概率地选择一场,选择的比赛可能有没ac过的题,他一定会ac这次比赛中的某一道,并说我好菜啊。如果全ac过了,也会说我好菜啊。求期望说多少次我好菜啊。

注意题目中每场题的范围是1到3

我们可以把相同题数的场看成同一种,那就有三种

把题意抽象成取球游戏,就是\(i_1\)类型的球有\(a_1\)个,\(i_2\)类型的球有\(a_2\)个,\(i_3\)类型的球有\(a_3\)个,即将数量一样的比赛抽象成同一种球,问期望用多少次可以取到所有不同的球。不同种类的球取出会带来不同的变化,取了\(i_1\)类型的球会导致剩余没取的个数减一,但取了\(i_3\)类型的球因为这个比赛的题目数减一变成\(i_2\)类型,取了\(i_2\)类型的球就变成\(i_1\)类型的。

这个问题挺难的,那我们就先看一下最基本的取球游戏(彩票收集问题)

前序知识

最基本的取球问题就是\(n\)个球,求将每个球至少取一次,问期望用多少次可以取到所有不同的球。

假设现在还剩下\(i\)个球没取过,那么这时取到没取过的球的概率是

\(P=i / N\)

由于这个事件满足几何分布,所以他的期望就是\(1/p\),就是\(N/i\)

几何分布(Geometric distribution)是离散型概率分布。其中一种定义为:在n次伯努利试验中,试验k次才得到第一次成功的机率。详细地说,是:前k-1次皆失败,第k次成功的概率。

用\(dp[i]\)表示剩下\(i\)个球没取时多少次取到剩下所有不同的球的期望

那么可以得出一下递推式:
\[ dp[0]=0 \]
由期望的可加性:
\[ dp[i]=N/i+dp[i-1] \]

本题题解

这题就是取球游戏改编的,但是状态比较多,变成了3维的

根据上面的递推式和本题题意,得出以下状态转移方程,令\(dp[i][j][k]\)为剩下三种球没取时多少次取到所有不同的球的期望。再令\(M=i+j+k\)
\[ dp[0][0][0]=0 \]

因为当前的状态有三种可能状态转移,并且每场比赛的选择都是等概率的,将后继状态已经求出的期望加上当前状态取出不同的球的期望。

\[ dp[i][j][k]=N/M+dp[i-1][j][k]* i/M+dp[i+1][j-1][k] * j/M+dp[i][j+1][k-1]* k/M \]

化简一下就是(好像没怎么化简)

\[ dp[i][j][k]=(N+dp[i-1][j][k] * i+dp[i+1][j-1][k] * j+dp[i][j+1][k-1] * k)/M \]

代码

可以将\(k\)优化一下,枚举所有的状态,然后暴力转移

#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
const int maxn = 505;
const int mod=17680321;
ll inv[maxn];
ll num[4];
ll dp[maxn][maxn][2];
void init(int n){inv[1]=1;for(int i=2;i<=n;++i){inv[i]=1ll*(mod-mod/i)*inv[mod%i]%mod;}
}
int main() {ios::sync_with_stdio(0);cin.tie(0);int n;cin>>n;init(n);for(int i=1,a;i<=n;++i) {cin>>a;num[a]++;}dp[0][0][0]=0;int t=1;for (int k = 0; k <= num[3]; k++) {t ^= 1;for (int j = 0; j +k<= n; j++){for (int i = 0; i +k+j<= n; i++){if (i || j || k) {dp[i][j][t] = 1ll * n * inv[i + j + k] % mod;if (i)dp[i][j][t] = (dp[i][j][t] + 1ll * dp[i - 1][j][t] * i % mod * inv[i + j + k]) % mod;if (j)dp[i][j][t] = (dp[i][j][t] + 1ll * dp[i + 1][j - 1][t] * j % mod * inv[i + j + k]) % mod;if (k)dp[i][j][t] = (dp[i][j][t] + 1ll * dp[i][j + 1][t ^ 1] * k % mod * inv[i + j + k]) % mod;}}}}cout<<dp[num[1]][num[2]][t]<<endl;return 0 ;
}

总结

与常规的求解不同,数学期望经常逆向推出。
常言道:"正向推概率,反向推期望"
为什么呢?
大家可以百度一下(逃

博客:https://www.cnblogs.com/smallocean/

转载于:https://www.cnblogs.com/smallocean/p/11211124.html

[概率DP]相逢是温厚相关推荐

  1. 2018.09.01 poj3071Football(概率dp+二进制找规律)

    传送门 概率dp简单题. 设f[i][j]表示前i轮j获胜的概率. 如果j,k能够刚好在第i轮相遇,找规律可以发现j,k满足: (j−1)>>(i−1)(j−1)>>(i−1) ...

  2. Discovering Gold LightOJ - 1030[概率dp或者记忆化搜索]

    题目大意:有一个[1,n][1,n][1,n]的数轴,数轴上的每个对应位置上都有金矿,你初始位置是1,然后你每次都会投色子决定你下一步跳到哪里,如果你跳出了nnn,那么你就要重新投.问你跳到nnn的时 ...

  3. 【原创】概率DP总结 by kuangbin

    概率DP主要用于求解期望.概率等题目. 转移方程有时候比较灵活. 一般求概率是正推,求期望是逆推.通过题目可以体会到这点. 首先先推荐几篇参考的论文: <信息学竞赛中概率问题求解初探> & ...

  4. poj 3071 Football(概率dp)

    http://poj.org/problem? id=3071 大致题意:有2^n个足球队分成n组打比赛.给出一个矩阵a[][],a[i][j]表示i队赢得j队的概率.n次比赛的流程像这样France ...

  5. HDU 5001 概率DP || 记忆化搜索

    2014 ACM/ICPC Asia Regional Anshan Online 给N个点,M条边组成的图,每一步能够从一个点走到相邻任一点,概率同样,问D步后没走到过每一个点的概率 概率DP  測 ...

  6. hdu 3853 LOOPS 概率DP

    简单的概率DP入门题 代码如下: 1 #include<iostream> 2 #include<stdio.h> 3 #include<algorithm> 4 ...

  7. HDU - 4035 Maze(概率dp)

    题目链接:点击查看 题目大意:给出一个 n 个点的树,初始时位于点 1 ,每个点都会给出一个概率 k[ i ] 和一个概率 e[ i ] ,其代表的意义分别是: k[ i ] :在点 i 有 k[ i ...

  8. SDUT - 2623 The number of steps(概率dp)

    题目链接:点击查看 题目大意:给出一个 n 层的三角形,第一层有 1 个点,第二层有 2 个点,第三层有 3 个点 ... 第 n 层有 n 个点,现在规定从第一层的点向下出发: 如果左下方有点并且右 ...

  9. 牛客练习赛26B 烟花 (概率DP)

    链接:https://ac.nowcoder.com/acm/contest/180/B 来源:牛客网 烟花 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5 ...

最新文章

  1. nginx try_files的理解
  2. 显示桌面,原来这么简单的
  3. 动态换ip如何实现_三种方法解决动态换IP需求
  4. 图片,表格末尾紧贴上方图片或表格添加脚注/备注
  5. 掘地求生是什么游戏 把主播都逼疯的玩个锤子是什么游戏-李廷学
  6. 服务器装win10稳定吗,win10哪个版本最稳定好用 目前win10最稳定的版本推荐
  7. Cisco CCIE之建立详细的故障检测检查表
  8. WinRar去除弹窗广告的学习和研究
  9. PhyGeoNet一种可用于不规则区域的物理信息极限学习机
  10. 理解HTTPS加密安全传输流程
  11. 博友的 编写高质量代码 改善java程序的151个建议
  12. [生存志] 第56节 李聃函谷授道德经
  13. brpc源码学习(一)-butex
  14. 自动驾驶系统2.0:安全展望
  15. 《量化炼金术-中低频量化交易策略研发》读书笔记-序言,引言
  16. 如何利用python刷微博粉丝_使用python进行新浪微博粉丝爬虫
  17. Keil5打开工程时,弹窗提示not found device
  18. C++-生日-星座-性格查询
  19. jpg转pdf转换器 注册码
  20. 手机忘记密码解锁的 6 大软件方法

热门文章

  1. 有限体积法(5)——对流-扩散方程的离散
  2. Leetcode题目分类指南(单独刷题或学习算法书籍配合使用)
  3. Shell read命令详解
  4. 上位机开发流程-小白开始
  5. 转:oracle ocp 指南
  6. 学习笔记整理——vim,vim文件编码,vim配置文件
  7. 远程传输大文件使用什么平台好呢?
  8. sql语句,sql文件加注释
  9. 土木工程与计算机专业考研学校排名,土木工程专业考研学校排名
  10. hdu2191 买大米 多重背包 模板题