2020-2021 ACM-ICPC Brazil Subregional Programming Contest A. Sticker Album
期望dp
https://codeforces.com/gym/102861/problem/A
大小为n的背包,无限个物品随机在 [ a , b ] [a,b] [a,b]之间,计算E(n),E(n)表示随机选择物品,填满背包需要的期望物品数量
tip1: 普通期望dp是n*(b-a+1)的复杂度, 观察dp公式可以发现可以用滑块保存下一个状态
-
d p [ i ] = 1 l ∗ d p [ i − a ] + 1 l ∗ d p [ i − a + 1 ] + ⋯ + 1 l ∗ d p [ i − b ] + 1 dp[i] = \frac{1}{l} * dp[i-a] + \frac{1}{l} * dp[i-a+1] + \cdots + \frac{1}{l}* dp[i-b] + 1 dp[i]=l1∗dp[i−a]+l1∗dp[i−a+1]+⋯+l1∗dp[i−b]+1
-
s u m = d p [ i − a ] + d p [ i − a + 1 ] + ⋯ + d p [ i − b ] sum = dp[i-a] + dp[i-a + 1] + \cdots + dp[i-b] sum=dp[i−a]+dp[i−a+1]+⋯+dp[i−b]
tip2: a = 0 的时候存在dp[i] -> dp[i-1]的转移需要特殊考虑
-
d p [ i ] = 1 l ∗ d p [ i ] + 1 l ∗ d p [ i + 1 ] + ⋯ + 1 l ∗ d p [ i − b ] + 1 dp[i] = \frac{1}{l} * dp[i] + \frac{1}{l} * dp[i+1] + \cdots + \frac{1}{l}* dp[i-b] + 1 dp[i]=l1∗dp[i]+l1∗dp[i+1]+⋯+l1∗dp[i−b]+1
⇓ \Downarrow ⇓
l − 1 l ∗ d p [ i ] = 1 l ∗ d p [ i + 1 ] + ⋯ + 1 l ∗ d p [ i − b ] + 1 \frac{l-1}{l}*dp[i] = \frac{1}{l} * dp[i+1] + \cdots + \frac{1}{l}* dp[i-b] + 1 ll−1∗dp[i]=l1∗dp[i+1]+⋯+l1∗dp[i−b]+1
-
s u m = d p [ i + 1 ] + ⋯ + d p [ i − b ] sum = dp[i + 1] + \cdots + dp[i - b] sum=dp[i+1]+⋯+dp[i−b]
ll n, a, b, len;
int main()
{
cin >> n >> a >> b;
len = b - a + 1;
for (int i = n - 1; i >= 0; i--) {
if (a)
dp[i] = (sum / len + 1.0);
else
dp[i] = (sum + len) / (len - 1);
sum -= dp[i + b];
if (a)
sum += dp[i + a - 1];
else
sum += dp[i];
}
cout << fixed << setprecision(10) << dp[0] << endl;
return 0;
}
我看见 你

浙公网安备 33010602011771号