知识点:期望DP
划重点:期望DP要从后往前推,终点的期望为0
设选出m个点的的期望是X,选出m + 1个点的期望是Y
则X = 1 + X * m / n + Y * (n - m) / n
下面说明公式的由来:
1:X状态下要选出一个点,这算一次操作,因此+1
X * m / n:若新选的点是选过的点(这样的概率是m / n),即选后没用并没有使状态发生改变,因此期望仍是X
Y * (n - m) / n:若新选的是未选过的点(这样的概率是(n - m) / n),选后变成选出了m + 1个点的状态,因此期望是Y
上式化简得: X= n / (n - m) + Y
初始状态是已选出一个点
做法1:从后往前推到 f[1] 即可得到答案
做法2:由化简后的公式可以看出,答案就是从
法1 代码
#include <iostream>
#include <cstdio>
using namespace std;
const int N = 200010;
double f[N];
int n, m;
double dp(int k) {
if (k == n) return 0;
return n * 1.0 / (n - k) + dp(k + 1);
}
int main() {
cin >> n;
printf("%f", dp(1));
return 0;
}
法二代码
#include <iostream>
#include <cstdio>
using namespace std;
const int N = 200010;
double f[N];
int n, m;
double dp(int k) {
if (k == n) return 0;
return n * 1.0 / (n - k) + dp(k + 1);
}
int main() {
cin >> n;
double ans = 0;
for (int i = 1; i < n; i ++) ans += n / (n * 1.0 - i);
printf("%f", ans);
return 0;
}