Loading

ZOJ - 3640 Help Me Escape 概率DP

ZOJ-3640 Help Me Escape 概率DP

题意

有一个人要逃离一个洞穴,现提供 \(n\) 条出路,每条出路有危险值 \(c_i\) ,这个人的武力值为\(f\)

每天这个人会随机一条路,若 \(f\) > \(c_i\) ,那么可以通过\(t_i\) 的时间逃离这里

否则就要等下一天,但是这时他的武力值会加上\(c_i\) 。问逃离的期望天数。

分析

这题应该算是比较简单的概率DP,

\(dp_i\) 表示当前武力值为\(i\) 时,逃离的期望天数。

那么显然有

\[dp_i += \begin{cases} \frac{1}{n}\cdot t[i], i \geq c_i \\ (1 + dp_{i + c_i}),i < c_i \end{cases} \]

注意数组开到两倍(细节)

double dp[10005 << 1];
int vis[10005 << 1];
int c[105];
int t[105];
int n, m;

double dfs(int x) {
    if (vis[x]) return dp[x];
    double ans = 0;
    for (int i = 0; i < n; i++)
        if (x > c[i]) ans += 1.0 / n * t[i];
        else ans += 1.0 / n * (1 + dfs(x + c[i]));
    return dp[x] = ans;
}

int main() {
    while (~scanf("%d%d", &n, &m)) {
        memset(vis, 0, sizeof vis);
        memset(dp, 0, sizeof dp);
        for (int i = 0; i < n; i++) c[i] = readint(),t[i] = (1 + sqrt(5)) / 2 * c[i] * c[i];
        printf("%.3f\n", dfs(m));
    }
}
posted @ 2020-08-21 21:18  MQFLLY  阅读(90)  评论(0编辑  收藏  举报