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]=l1dp[ia]+l1dp[ia+1]++l1dp[ib]+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[ia]+dp[ia+1]++dp[ib]

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]=l1dp[i]+l1dp[i+1]++l1dp[ib]+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 ll1dp[i]=l1dp[i+1]++l1dp[ib]+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[ib]

    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;
    }
posted @ 2020-11-29 20:04  naymi  阅读(58)  评论(0)    收藏  举报