[BZOJ1426]收集郵票(期望 DP)
阿新 • • 發佈:2018-12-08
Address
Solution
- 先定義狀態
- 表示當前已經收集了 張郵票的情況下,將 張郵票全部收集的期望費用
- 然後你會發現無法轉移——我們不知道現在購買的郵票是第幾張
- 所以再次記錄 表示當前已經收集了 張郵票的情況下,將 張郵票全部收集的期望購買次數
- 顯然
- 當 時,有
- 解方程得
- 而 表示當前已經收集了 張郵票,並且下一次購買郵票的費用為 的情況下,將 張郵票全部收集的期望費用
- 分析下轉移:如果當前已經收集了 張郵票,並且現在又用 的費用購買了一張郵票
- 那麼之後所有郵票的費用都加一
- 而期望情況下之後需要再收集 (或 )張郵票
- 所以相當於之後多了 (或 )的額外費用
- 於是
- 解方程得
- 最後答案
- 複雜度
Code
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define Rof(i, a, b) for (i = a; i >= b; i--)
const int N = 1e4 + 5;
int n;
double f[N], g[N];
int main()
{
int i;
std::cin >> n;
Rof (i, n - 1, 0)
{
g[i] = g[i + 1] + 1.0 * n / (n - i);
f[i] = 1.0 * n / (n - i) + 1.0 * i / (n - i) * g[i]
+ f[i + 1] + g[i + 1];
}
printf("%.2lf\n", f[0]);
return 0;
}