期望,简单来说就是做一个事情可能得到结果的平均值。
在17世纪,有一个赌徒向法国著名数学家帕斯卡挑战,给他出了一道题目:甲乙两个人赌博,他们两人获胜的机率相等,比赛规则是先胜三局者为赢家,一共进行 555 局,赢家可以获得 100100100 法郎的奖励。当比赛进行到第 444 局的时候,甲胜了 222 局,乙胜了 111 局,这时由于某些原因中止了比赛,那么如何分配这 100100100 法郎才比较公平?
用概率论的知识,不难得知,甲获胜的可能性大,乙获胜的可能性小。
因为甲输掉后两局的可能性只有 12×12=14\frac{1}{2}\times\frac{1}{2}=\frac{1}{4}21×21=41,也就是说甲赢得后两局或后两局中任意赢一局的概率为 1−14=341-\frac{1}{4}=\frac{3}{4}1−41=43,甲有 75%75\%75% 的期望获得 100100100 法郎;而乙期望赢得 100100100 法郎就得在后两局均击败甲,乙连续赢得后两局的概率为 12×12=14\frac{1}{2}\times\frac{1}{2}=\frac{1}{4}21×21=41,即乙有 25%25\%25% 的期望获得 100100100 法郎奖金。
可见,虽然不能再进行比赛,但依据上述可能性推断,甲乙双方最终胜利的客观期望分别为 75%75\%75% 和 25%25\%25%,因此甲应分得奖金的 100×75%=75100\times75\%=75100×75%=75 法郎,乙应分得奖金的的 100×25%=25100\times25\%=25100×25%=25 法郎。这个故事里出现了“期望”这个词,数学期望由此而来。
例子:
某城市有 100000100000100000 个家庭,没有孩子的家庭有 400040004000 个,有一个孩子的家庭有 900009000090000 个,有两个孩子的家庭有 600060006000 个,有3个孩子的家庭有 300030003000 个,则每个家庭期望有多少个孩子?
则此城市中任一个家庭中孩子的数目是一个随机变量,记为 XXX。它可取值 0,1,2,30,1,2,30,1,2,3。
其中,XXX 取 000 的概率为 0.040.040.04,取 111 的概率为 0.90.90.9,取 222 的概率为 0.020.020.02,取 333 的概率为 0.020.020.02。
设它的数学期望值为 E(X)E(X)E(X),则 E(X)=0×0.01+1×0.9+2×0.02+3×0.02=1E(X)=0\times0.01+1\times0.9+2\times0.02+3\times0.02=1E(X)=0×0.01+1×0.9+2×0.02+3×0.02=1. 所以每个家庭期望有 111 个孩子。
现在,我们来把这种期望计算方法运用在编程题中。
[ABC350E] Toward 0
给定整数 nnn 。可以执行以下两种操作。
- 消耗 xxx 日元将 nnn 变为 ⌊na⌋\lfloor \frac{n}{a}\rfloor⌊an⌋ 。
- 消耗 yyy 日元,在整数区间 [1,6][1,6][1,6] 内等概率选取一个整数 bbb ,将 nnn 变为 ⌊nb⌋\lfloor \frac{n}{b}\rfloor⌊bn⌋ 。
求在最优策略下将 nnn 变为 000 需要消耗的最少的日元。
同样的,可以通过 dfs 求期望需要的日元。
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n,a,x,y;
map <int,double> dp;
double dfs(int u)
{
if (!u) return 0;
if (dp[u]) return dp[u];
double f = x + dfs(u/a);
double g = 6*y;
for (int i = 2;i <= 6;i++) g += dfs(u/i);
g /= 5.0;
return dp[u] = min(f,g);
}
signed main()
{
cin >> n >> a >> x >> y;
printf("%.8lf",dfs(n));
return 0;
}
文章讲述了数学期望的概念,通过赌徒难题展示了其在决定奖金分配中的应用,并将其原理应用于编程题中,探讨如何使用动态规划求解最优策略,最小化将数字变为零所需的期望日元数。
2325

被折叠的 条评论
为什么被折叠?



