B - Discovering Gold LightOJ - 1030 期望dp 基础水题

写下为了以后不易忘记。

题目:https://vjudge.net/problem/LightOJ-1030

题意: 从一号点出发,每次抛筛子走不能超过终点(超过重新抛),走到n点结束。每个点都有一定的金子,问最后期望得到多少金子。。。

思路:从后往前想,从第n点开始走就只能得到n点的金子, 从n-2开始走可以得到(从n-1出发得到金子期望数)/2+(从n-1出发得到金子期望数)/2 ,往前递推就可以得到从1开始的金子数。

ac代码:

#include <stdio.h>
const int mx = 2e5;
double dp[mx];
int min(int a, int b) {
    return a>b?b:a;
}
int main() {
    int q, o = 1;
    scanf("%d", &q);
    while (q--) {
        printf("Case %d: ", o++);
        int n;
        scanf("%d", &n);
        for (int i = 1; i <= n; ++i)
            scanf("%lf", &dp[i]);
        for (int i = n-1; i > 0; --i) {
            int mi = min(6, n-i);
            for (int j = 1; j <= mi; ++j)
                dp[i] += dp[i+j]/mi;
        }
        printf("%f\n", dp[1]);
    }
    return 0;
}
发布了74 篇原创文章 · 获赞 29 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/ClonH/article/details/102898014