LightOJ 1248 Dice (III)
题意
有一个 \(n\) 面的骰子,每次投掷每个面都是等概率出现,求所有面都出现的期望投掷次数。
思路
我们进行一个状态定义:\(f[i]\) 表示已经出现了 \(i\) 个不同的面的期望,那么我们考虑 \(f[i]\) 可以由谁转移过来?
显然我们每次投掷最多只会出现一个面,这个面有两种情况,第一种为出现过的,第二种为没出现过的
那么 \(f[i]\) 有 \(\frac{i}{n}\) 的概率由出现过的面转移而来, 有 \(\frac{n-i}{n}\) 的概率从未出现的面转移过来,并且无论从哪里来,期望次数都会比原来多 \(1\)
即\(f[i] = \frac{i}{n} \times f[i] + \frac{n-i}{n} \times f[i-1] + 1\) 移项可得 \(f[i] = f[i-1] + \frac{n}{n-i}\)
点击查看代码
/********************
Author: Nanfeng1997
Contest: LightOJ
URL: https://lightoj.com/problem/dice-iii
When: 2022-03-22 14:46:47
Memory: 64MB
Time: 1000ms
********************/
#include <bits/stdc++.h>
#define _ 0
using namespace std;
using LL = long long;
double dp[100010];
void solve(int T) {
int n; cin >> n;
dp[1] = 1;
for(int i = 2; i <= n; i ++ ) {
dp[i] = dp[i - 1] + 1.0 * n / (i - 1);
}
printf("Case %d: %.10f\n", T, dp[n]);
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T = 1, r = 0; cin >> T;
while(T --) solve(++ r);
return ~~(0 ^ _ ^ 0);
}