期望,简单来说就是做一个事情可能得到结果的平均值。
在17世纪,有一个赌徒向法国著名数学家帕斯卡挑战,给他出了一道题目:甲乙两个人赌博,他们两人获胜的机率相等,比赛规则是先胜三局者为赢家,一共进行 5 5 5 局,赢家可以获得 100 100 100 法郎的奖励。当比赛进行到第 4 4 4 局的时候,甲胜了 2 2 2 局,乙胜了 1 1 1 局,这时由于某些原因中止了比赛,那么如何分配这 100 100 100 法郎才比较公平?
用概率论的知识,不难得知,甲获胜的可能性大,乙获胜的可能性小。
因为甲输掉后两局的可能性只有 1 2 × 1 2 = 1 4 \frac{1}{2}\times\frac{1}{2}=\frac{1}{4} 21×21=41,也就是说甲赢得后两局或后两局中任意赢一局的概率为 1 − 1 4 = 3 4 1-\frac{1}{4}=\frac{3}{4} 1−41=43,甲有 75 % 75\% 75% 的期望获得 100 100 100 法郎;而乙期望赢得 100 100 100 法郎就得在后两局均击败甲,乙连续赢得后两局的概率为 1 2 × 1 2 = 1 4 \frac{1}{2}\times\frac{1}{2}=\frac{1}{4} 21×21=41,即乙有 25 % 25\% 25% 的期望获得 100 100 100 法郎奖金。
可见,虽然不能再进行比赛,但依据上述可能性推断,甲乙双方最终胜利的客观期望分别为 75 % 75\% 75% 和 25 % 25\% 25%,因此甲应分得奖金的 100 × 75 % = 75 100\times75\%=75 100×75%=75 法郎,乙应分得奖金的的 100 × 25 % = 25 100\times25\%=25 100×25%=25 法郎。这个故事里出现了“期望”这个词,数学期望由此而来。
例子:
某城市有
100000
100000
100000 个家庭,没有孩子的家庭有
4000
4000
4000 个,有一个孩子的家庭有
90000
90000
90000 个,有两个孩子的家庭有
6000
6000
6000 个,有3个孩子的家庭有
3000
3000
3000 个,则每个家庭期望有多少个孩子?
则此城市中任一个家庭中孩子的数目是一个随机变量,记为 X X X。它可取值 0 , 1 , 2 , 3 0,1,2,3 0,1,2,3。
其中, X X X 取 0 0 0 的概率为 0.04 0.04 0.04,取 1 1 1 的概率为 0.9 0.9 0.9,取 2 2 2 的概率为 0.02 0.02 0.02,取 3 3 3 的概率为 0.02 0.02 0.02。
设它的数学期望值为 E ( X ) E(X) E(X),则 E ( X ) = 0 × 0.01 + 1 × 0.9 + 2 × 0.02 + 3 × 0.02 = 1 E(X)=0\times0.01+1\times0.9+2\times0.02+3\times0.02=1 E(X)=0×0.01+1×0.9+2×0.02+3×0.02=1. 所以每个家庭期望有 1 1 1 个孩子。
现在,我们来把这种期望计算方法运用在编程题中。
[ABC350E] Toward 0
给定整数 n n n 。可以执行以下两种操作。
- 消耗 x x x 日元将 n n n 变为 ⌊ n a ⌋ \lfloor \frac{n}{a}\rfloor ⌊an⌋ 。
- 消耗 y y y 日元,在整数区间 [ 1 , 6 ] [1,6] [1,6] 内等概率选取一个整数 b b b ,将 n n n 变为 ⌊ n b ⌋ \lfloor \frac{n}{b}\rfloor ⌊bn⌋ 。
求在最优策略下将 n n n 变为 0 0 0 需要消耗的最少的日元。
同样的,可以通过 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;
}