概率期望dp

概率期望

LOOPS

dp[i][j]dp[i][j]dp[i][j]表示从i,ji, ji,jr,cr, cr,c的期望,有dp[i][j]=p0×dp[i][j]+p1×dp[i][j+1]+p2×dp[i+1][j]+2dp[i][j] = p_0 \times dp[i][j] + p_1 \times dp[i][j + 1] + p_2 \times dp[i + 1][j] + 2dp[i][j]=p0×dp[i][j]+p1×dp[i][j+1]+p2×dp[i+1][j]+2

dp[i][j]=(p1×dp[i][j+1]+p2×dp[i+1][j]+2)×11−p0dp[i][j] = (p_1 \times dp[i][j + 1] + p_2 \times dp[i + 1][j] + 2) \times \frac{1}{1 - p_0}dp[i][j]=(p1×dp[i][j+1]+p2×dp[i+1][j]+2)×1p01,从后面开始转移。

#include <bits/stdc++.h>using namespace std;const double eps = 1e-7;const int N = 1e3 + 10;double dp[N][N], p[N][N][3];int n, m;int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);// ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);while (scanf("%d %d", &n, &m) != EOF) {for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {for (int k = 0; k < 3; k++) {scanf("%lf", &p[i][j][k]);}}}memset(dp, 0, sizeof dp);for (int i = n; i >= 1; i--) {for (int j = m; j >= 1; j--) {dp[i][j] = (p[i][j][1] * dp[i][j + 1] + p[i][j][2] * dp[i + 1][j] + 2) / (1 - p[i][j][0]);}}printf("%.3f\n", dp[1][1]);}return 0;
}

Aeroplane chess

类似上一题,但是就是要每次碰到能跳的位置要一直跳转到不能再跳为止。

#include <bits/stdc++.h>using namespace std;const int N = 1e5 + 10;double dp[N];int a[N], n, m;int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);// ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);while (scanf("%d %d", &n, &m) && (n + m)) {memset(dp, 0, sizeof dp), memset(a, 0, sizeof a);for (int i = 1; i <= m; i++) {int x, y;scanf("%d %d", &x, &y);a[x] = y;}for (int i = n - 1; i >= 0; i--) {for (int j = 1; j <= 6; j++) {int cur = i + j;while (a[cur]) {cur = a[cur];}dp[i] += (dp[cur] + 1) / 6.0;}}printf("%.4f\n", dp[0]);}return 0;
}

One Person Game

容易推出:Ei=∑pkEi+k+p0E0+1接下来用待定系数法E0为我们要求的,假设Ei=aiE0+biEi=∑pk(ai+kE0+bi+k)+p0E0+1Ei=(∑pkai+k+p0)E0+∑pkbi+k+1ai=∑pkai+k+p0,bi=∑pkbi+k+1容易推出:E_i = \sum p_k E_{i + k} + p_0 E_0 + 1\\ 接下来用待定系数法\\ E_0为我们要求的,假设E_i = a_i E_0 + b_i\\ E_i = \sum p_k (a_{i + k} E_0 + b_{i + k}) + p_0 E_0 + 1\\ E_i = (\sum p_k a_{i + k} + p_0) E_0 + \sum p_k b_{i + k} + 1\\ a_i = \sum p_k a_{i + k} + p_0, b_i = \sum p_k b_{i + k} + 1\\ Ei=pkEi+k+p0E0+1E0Ei=aiE0+biEi=pk(ai+kE0+bi+k)+p0E0+1Ei=(pkai+k+p0)E0+pkbi+k+1ai=pkai+k+p0,bi=pkbi+k+1

#include <bits/stdc++.h>using namespace std;const int N = 510;double A[N], B[N], p[20];int n, k1, k2, k3, a, b, c;int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);// ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);int T;scanf("%d", &T);while (T--) {scanf("%d %d %d %d %d %d %d", &n, &k1, &k2, &k3, &a, &b, &c);memset(A, 0, sizeof A), memset(B, 0, sizeof B), memset(p, 0, sizeof p);p[0] = 1.0 / (k1 * k2 * k3);for (int i = 1; i <= k1; i++) {for (int j = 1; j <= k2; j++) {for (int k = 1; k <= k3; k++) {if (i == a && j == b && k == c) {continue;}p[i + j + k] += p[0];}}}for (int i = n; i >= 0; i--) {for (int j = 3; j <= k1 + k2 + k3; j++) {A[i] += p[j] * A[i + j];B[i] += p[j] * B[i + j];}A[i] += p[0];B[i] += 1;}printf("%.15f\n", B[0] / (1 - A[0]));}return 0;
}

Collecting Bugs

每次共有四种情况发生:

  • 这个bugbugbug出现在已有的子系统里,并且在已有的bugbugbug里,概率为is×in\frac{i}{s} \times \frac{i}{n}si×ni
  • 这个bugbugbug出现在已有的子系统里,但是是一个从未出现的新bugbugbug,概率为is×n−in\frac{i}{s} \times \frac{n - i}{n}si×nni
  • 这个bugbugbug出现在新的子系统里,但是是一个已有的bugbugbug,概率为s−is×in\frac{s - i}{s} \times \frac{i}{n}ssi×ni
  • 这个bugbugbug出现在新的子系统里,并且是一个新的bugbugbug,概率为s−is×n−in\frac{s - i}{s} \times \frac{n - i}{n}ssi×nni

综上:我们定义dp[i][j]dp[i][j]dp[i][j]表示已经在iii个子系统里出现过jjjbugbugbug,到在sss个子系统里出现过nnnbugbugbug的步数期望,

dp[i][j]=i×js×ndp[i][j]+i×(n−j)s×ndp[i][j+1]+(s−i)×js×ndp[i+1][j]+(s−i)×(s−j)s×ndp[i+1][j+1]dp[i][j] = \frac{i \times j}{s \times n} dp[i][j] + \frac{i \times (n - j)}{s \times n}dp[i][j + 1] + \frac{(s - i) \times j}{s \times n}dp[i + 1][j] + \frac{(s - i) \times (s - j)}{s \times n} dp[i + 1][j + 1]dp[i][j]=s×ni×jdp[i][j]+s×ni×(nj)dp[i][j+1]+s×n(si)×jdp[i+1][j]+s×n(si)×(sj)dp[i+1][j+1]

#include <bits/stdc++.h>using namespace std;const int N = 1e3 + 10;double dp[N][N];int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);// ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);int n, s;while (scanf("%d %d", &n, &s) != EOF) {memset(dp, 0, sizeof dp);for (int i = n; i >= 0; i--){for (int j = s; j >= 0; j--){if(i == n && j == s) {continue;}double factor = n * s - i * j;dp[i][j] = dp[i + 1][j] * j * (n - i) + dp[i][j + 1] * (s - j) * i + dp[i + 1][j + 1] * (n - i) *(s - j) + n * s;dp[i][j] /= factor;}}printf("%.4f\n", dp[0][0]);}return 0; 
}

Card Collector

容易想到dpdpdp转移方程dp[i]dp[i]dp[i]表示已经收集了iii张卡到收集nnn张卡所需地步数期望,

dp[i]=∑pk×dp[i+k]+p0×dp[i]+1dp[i] = \sum p_{k} \times dp[i + k] + p_0 \times dp[i] + 1dp[i]=pk×dp[i+k]+p0×dp[i]+1

dp[i]=∑pk×dp[i+k]+11−p0dp[i] = \frac{\sum p_k \times dp[i + k] + 1} {1 - p_0}dp[i]=1p0pk×dp[i+k]+1

p0+∑pk=1p_0 + \sum p_k = 1p0+pk=1

然后逆向进行dpdpdp即可。

#include <bits/stdc++.h>using namespace std;const int N = 25;double dp[1 << 21], p[N];int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);// ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);int n;while (scanf("%d", &n) != EOF) {for (int i = 0; i < n; i++) {scanf("%lf", &p[i]);}memset(dp, 0, sizeof dp);for (int i = (1 << n) - 2; i >= 0; i--) {double delt = 0;for (int j = 0; j < n; j++) {if (i >> j & 1) {continue;}delt += p[j];dp[i] += p[j] * dp[i | (1 << j)];}dp[i] += 1;dp[i] /= delt;}printf("%.4f\n", dp[0]);}return 0; 
}

1765 谷歌的恐龙

在每一层我们的期望应该是a0=n×(n−1)2a_0 = \frac{n \times (n - 1)}{2}a0=2n×(n1),我们每一次有q=n−mnq = \frac{n - m}{n}q=nnm的概率继续游戏,

所以有如下a0,a0×q,a0×q2,a0×a3,…,an−1×qn−1,an×ana_0, a_0 \times q, a_0 \times q ^ 2, a_0 \times a ^ 3, \dots,a_{n - 1} \times q ^{n - 1}, a_{n} \times a ^{n}a0,a0×q,a0×q2,a0×a3,,an1×qn1,an×an

a0×1−qn1−q,na_0 \times \frac{1 - q ^ n}{1 - q}, na0×1q1qn,n趋于无穷大时,qn=0q ^ n = 0qn=0,有a01−q=a0mn=n2×(n−1)2×m\frac{a_0}{1 - q} = \frac{a_0}{\frac{m}{n}} = \frac{n ^ 2 \times (n - 1)}{2 \times m}1qa0=nma0=2×mn2×(n1)

所以期望为n×(n−1)2×m\frac{n \times (n - 1)}{2 \times m}2×mn×(n1)

#include <bits/stdc++.h>using namespace std;int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);// ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);double n, m;scanf("%lf %lf", &n, &m);printf("%.6f\n", n * (n - 1) / 2 / m);return 0;
}

P4550 收集邮票

∑i=1n=n2+n2所以我们分别求出n2,n的期望即可,f[i]表示从i到n,n的期望,g[i]表示从i到n,n2的期望。n的期望:f[i]=in(f[i]+1)+n−in(f[i+1]+1)n2的期望g[i]=in(f[i]+1)2+n−in(f[i+1]+1)2f[i]2=g[i],f[i+1]2=g[i+1]化简有:f[i]=f[i+1]+nn−ig[i]=g[i+1]+2f[i+1]+2in−if[i]+nn−i\sum_{i = 1} ^{n} = \frac{n ^ 2 + n}{2}\\ 所以我们分别求出n ^ 2, n的期望即可,f[i]表示从i 到n, n的期望,g[i] 表示从i 到n,n ^ 2的期望。\\ n的期望:\\ f[i] = \frac{i}{n}(f[i] + 1) + \frac{n - i}{n}(f[i + 1] + 1)\\ n ^ 2的期望\\ g[i] = \frac{i}{n}(f[i] + 1) ^ 2 + \frac{n - i}{n}(f[i + 1] + 1) ^ 2\\ f[i] ^ 2 = g[i], f[i + 1] ^ 2 = g[i + 1]\\ 化简有:f[i] = f[i + 1] + \frac{n}{n - i}\\ g[i] = g[i + 1] + 2f[i + 1] + 2\frac{i}{n - i}f[i] + \frac{n}{n - i}\\ i=1n=2n2+nn2,nf[i]in,n,g[i]in,n2n:f[i]=ni(f[i]+1)+nni(f[i+1]+1)n2g[i]=ni(f[i]+1)2+nni(f[i+1]+1)2f[i]2=g[i],f[i+1]2=g[i+1]:f[i]=f[i+1]+ning[i]=g[i+1]+2f[i+1]+2niif[i]+nin

#include <bits/stdc++.h>using namespace std;const int N = 1e4 + 10;double f[N], g[N];int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);// ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);int n;scanf("%d", &n);for (int i = n - 1; i >= 0; i--) {f[i] = f[i + 1] + 1.0 * n / (n - i);g[i] = g[i + 1] + 2 * f[i + 1] + 2.0 * i / (n - i) * f[i] + 1.0 * n / (n - i);}printf("%.2f\n", (f[0] + g[0]) / 2);return 0;
}

P3802 小魔女帕琪

#include <bits/stdc++.h>using namespace std;int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);// ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);double a[7], sum = 0;for (int i = 0; i < 7; i++) {cin >> a[i];sum += a[i];}double ans = 1;for (int i = 0; i < 6; i++) {ans = ans * (i + 1) * a[i] / (sum - i);}ans *= a[6];printf("%.3f\n", ans * 7.0);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/314017.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2019-03-13-算法-进化(验证回文串)

题目描述 给定一个字符串&#xff0c;验证它是否是回文串&#xff0c;只考虑字母和数字字符&#xff0c;可以忽略字母的大小写。 说明&#xff1a;本题中&#xff0c;我们将空字符串定义为有效的回文串。 示例 1: 输入: "A man, a plan, a canal: Panama" 输出: t…

.NET中国峰会 参与意愿调查

2014年微软组织成立.NET基金会&#xff0c;微软在成为主要的开源参与者的道路上又前进了一步。2014年以来已经有众多知名公司加入.NET基金会, 仅在平台项目中&#xff0c;.NET平台上有87&#xff05;贡献者其实不在Microsoft工作。将.NET基金会变成一个更加多样化和成员驱动的组…

2019-03-14-算法-进化(两个数组的交集 II)

题目描述 给定两个数组&#xff0c;编写一个函数来计算它们的交集。 示例 1: 输入: nums1 [1,2,2,1], nums2 [2,2] 输出: [2,2]示例 2: 输入: nums1 [4,9,5], nums2 [9,4,9,8,4] 输出: [4,9]说明&#xff1a; 输出结果中每个元素出现的次数&#xff0c;应与元素在两个数…

方案计数(带修计数题/线段树)

方案计数 对于一个n个队员&#xff0c;每个队员有一个权值Vi&#xff0c;然后每次选择三个权值相同的A类队员&#xff0c;两个权值小于A类的B类队员&#xff0c;并且B类队员要在A类队员两侧。 Q次操作&#xff0c;每次限制或解除限制一个队员成为A类队员。 首先枚举中间的A类…

线性基专题

线性基 P3812 【模板】线性基 #include <bits/stdc.h>using namespace std;typedef long long ll;struct linearbasis {ll base[64], flag, cnt;void add(ll x) {for(int i 62; ~i; i--) {if(x >> i & 1) {if(!base[i]) {base[i] x;return ;}x ^ base[i];}…

听我的!美国科技公司这样做Code Review

Code Review&#xff0c;在当代的软件开发中占有重要的一环。虽然国内各大主流公司都已经参照国外同行设立了比较严格的Code Review机制&#xff0c;但是还是有好多大型软件公司以及中小型软件公司还未推行这一重要制度。那么在美国的科技企业中&#xff0c;Code Review推行的怎…

无向图三元环计数

无向图三元环计数 这个做法的思想还是很巧妙的&#xff0c;首先我们考虑枚举&#xff0c;暴力的方法就是枚举三个点O(n3)O(n^3)O(n3)&#xff0c;枚举一个点然后枚举出边&#xff0c;然后再枚举出点的出边&#xff0c;然后考虑这个做法的复杂度。对于每条边分析&#xff0c;它…

2019-03-14-算法-进化(移动零)

题目描述 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 示例: 输入: [0,1,0,3,12] 输出: [1,3,12,0,0]说明: 必须在原数组上操作&#xff0c;不能拷贝额外的数组尽量减少操作次数 /*** 思路1&#xff1a;…

美味果冻(牛客练习赛53B)

美味果冻 ∑i1n∑j1ii⌊ij⌋j∑i1n∑jinj⌊ji⌋i\sum_{i 1} ^{n} \sum_{j 1} ^{i} i \times \lfloor \frac{i}{j} \rfloor ^ j\\ \sum_{i 1} ^{n} \sum_{j i} ^{n} j \times \lfloor \frac{j}{i} \rfloor ^ i\\ i1∑n​j1∑i​i⌊ji​⌋ji1∑n​ji∑n​j⌊ij​⌋i 接下来只…

程序员过关斩将--互联网人必备知识cookie和session认证

菜菜&#xff0c;上次你说的cookie和session的文章&#xff0c;我觉得不太具体那你想怎么样具体呢&#xff1f;我自己从网上查了一下&#xff0c;很多关于cookie和session认证的&#xff0c;能不能给我讲讲用户认证呀&#xff0c;可以呀这样我下次再去面试&#xff0c;有可能会…

2019-03-15-算法-进化(两数之和)

题目描述 给定一个整数数组 nums 和一个目标值 target&#xff0c;请你在该数组中找出和为目标值的那 两个 整数&#xff0c;并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;你不能重复利用这个数组中同样的元素。 示例: 给定 nums [2, 7, 1…

51nod 1847 奇怪的数学题(数论/min25筛/杜教筛/斯特林数)

51nod 1847 奇怪的数学题 求解∑i1n∑j1nsgcd(i,j),sgcd\sum_{i1}^n\sum_{j1}^nsgcd(i,j),sgcd∑i1n​∑j1n​sgcd(i,j),sgcd表示次大公约数,n≤1010n\le{10^{10}}n≤1010 那么首先有sgcd(i,j)gcd(i,j)/mn(gcd(i,j))sgcd(i,j)gcd(i,j)/mn(gcd(i,j))sgcd(i,j)gcd(i,j)/mn(gcd(…

.NET Core ASP.NET Core Basic 1-2 控制反转与依赖注入

本节内容为控制反转与依赖注入简介控制反转IOC这个内容事实上在我们的C#高级篇就已经有所讲解&#xff0c;控制反转是一种设计模式&#xff0c;你可以这样理解控制反转&#xff0c;假设有一个人他有一部A品牌手机&#xff0c;他用手机进行听歌、打游戏&#xff0c;那么你可以创…

2019-03-15-算法-进化(有效的数独)

题目描述 判断一个 9x9 的数独是否有效。只需要根据以下规则&#xff0c;验证已经填入的数字是否有效即可。数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。上图是一个部分填充的有效的数独。 数独…

STL归并排序

STL归并排序 https://blog.csdn.net/weixin_44176696/article/details/104431124 分为原地归并和异地归并&#xff0c;而且可以自定义比较函数&#xff0c;非常方便。

清明梦超能力者黄YY、异或树(线段树合并)

清明梦超能力者黄YY 这题有点像【雨天的尾巴】【永无乡】的结合版本&#xff0c;树上差分&#xff0c;线段树合并&#xff0c;权值线段树查找第kkk大。 对于操作iii&#xff0c;我们可以对u−>vu->vu−>v路径上的点&#xff0c;iii的权值加上111&#xff0c;然后线段…

net core WebApi——尝试企业微信来开发企业内部应用

前言这几天忙活着别的东西&#xff0c;耽误了很长时间&#xff0c;从文件操作完了之后就在考虑着下一步鼓捣点儿啥&#xff0c;因为最开始的业务开发就是企业微信相关的&#xff0c;这刚好来做个内部应用的小例子玩玩。企业微信前身是企业号&#xff0c;当时微信主推的还是公众…

2019-03-18-算法-进化(字符串中的第一个唯一字符)

题目描述 给定一个字符串&#xff0c;找到它的第一个不重复的字符&#xff0c;并返回它的索引。如果不存在&#xff0c;则返回 -1。 案例: s "leetcode" 返回 0.s "loveleetcode", 返回 2.注意事项&#xff1a;您可以假定该字符串只包含小写字母。 思…

P2619 [国家集训队]Tree I(WQS二分/带权二分/最小生成树)

P2619 [国家集训队]Tree I 给定一个n个点&#xff0c;m条边的无向图&#xff0c;每条边有一个颜色黑色或者白色&#xff0c;求解恰好有k条白色边的最小生成树。 那么看到恰好选择k个的最优性问题&#xff0c;我们可以利用WQS二分解决&#xff0c;实际上就是利用了对于每个选择…

E. Party Company(树上问题)

E. Party Company 容易发现这是一颗树形结构&#xff0c;根节点为111&#xff0c;并且有点权从根节点开始递减。 题目大意就是给定一个点u,l,ru, l, ru,l,r&#xff0c;对于于uuu在同一个连通块里&#xff0c;并且点权是在[l,r][l, r][l,r]之间的点答案贡献加一。 如果理解到…