首页 > 其他 > 详细

Codeforces Round #265 (Div. 1) D. World of Darkraft - 2

时间:2020-02-01 17:14:17      阅读:64      评论:0      收藏:0      [点我收藏+]

 

由期望的线性性,$E(\sum \limits_{i=1}^{k} X_i) = \sum \limits_{i=1}^k E(X_i)=kE(X_1)$,只需要求出打完 $n$ 个怪后一件武器的期望值。

$dp[i][j]$ 表示打完 $i$ 个怪后,初始 level 为 $j$ 的武器能赚的钱,$dp[0][j] = 0$,所求为 $dp[n][1]$。

转移方程为 $dp[i][j] = \frac{k-1}{k}dp[i-1][j] + \frac{1}{k}(\frac{1}{j+1}\sum \limits_{t=1}^{j}(dp[i-1][j]+t)+\frac{1}{j+1}(dp[i-1][j+1]+j))=\frac{k-1}{k}dp[i-1][j]+\frac{1}{k(j+1)}(jdp[i-1][j]+dp[i-1][j+1]+\frac{j(j+3)}{2})$

然后因为是浮点计算,第二维只要到 $O(\sqrt n)$ 级别就可以了。

技术分享图片
#include <bits/stdc++.h>

#define db double
db dp[2][850];

int main() {
    int n, k;
    scanf("%d%d", &n, &k);
    int t = std::min(n, 800);
    int now = 1;
    for (int i = 1; i <= n; i++) {
        for (int j = t; j >= 1; j--) {
            dp[now][j] = dp[now ^ 1][j] * (k - 1) / (1.0 * k) + (j * dp[now ^ 1][j] + dp[now ^ 1][j + 1] + j * (j + 3) / 2.0) / (1.0 * k * (j + 1));
        }
        now ^= 1;
    }
    printf("%.10f\n", k * dp[now ^ 1][1]);
    return 0;
}
View Code

 

Codeforces Round #265 (Div. 1) D. World of Darkraft - 2

原文:https://www.cnblogs.com/Mrzdtz220/p/12249058.html

(1)
(1)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!