【FZYZOJ】「Paladin」瀑布 题解(期望+递推)

题目描述

CX在Minecraft里建造了一个刷怪塔来杀僵尸。刷怪塔的是一个极高极高的空中浮塔,边缘是瀑布。如果僵尸被冲入瀑布中,就会掉下浮塔摔死。浮塔每天只能工作 $t$秒,刷怪笼只能生成 $N$ 只僵尸,这些僵尸在一开始就全部生成,位于瀑布上。由于CX是拿着手机搭的浮塔,难免有些建筑方面的缺陷,导致不是所有僵尸都会被冲下去。详细地说,在这 $t$秒内,每秒冲下一只僵尸(如果有的话)的概率为 $P$ ,这只僵尸一秒内没有被冲下的概率为$1-P$

CX想知道他一天内杀死的僵尸的期望数量。

输入格式

输入共一行,三个数N、P、t如题意。

输出格式

输出数学期望,并四舍五入保留七位小数。

--------------------------------------------------

设$f[i][j]$表示$i$秒冲下$j$只僵尸的概率。得到递推式:

$f[i][j]=p*f[i-1][j-1]+(1-p)*f[i-1][j]$

特别地,有:

$f[i][n]=f[i-1][n]+p*f[i-1][n-1]$

注意边界:$f[0][0]=1,f[i][0]=(1-p)*f[i-1][0],f[0][i]=0$。

$ans=\sum\limits_{i=1}^n f[t][i]*i$

代码:

#include<bits/stdc++.h>
using namespace std;
double ans,f[2001][2001],p,q;
int n,t;
int main()
{
    scanf("%d%lf%d",&n,&p,&t);
    q=1-p;
    f[0][0]=1;
    for (int i=1;i<=n;i++) f[0][i]=0;
    for (int i=1;i<=t;i++) f[i][0]=q*f[i-1][0];
    for (int i=1;i<=t;i++)
        for (int j=1;j<=n-1;j++)
            f[i][j]=p*f[i-1][j-1]+q*f[i-1][j];
    for (int i=1;i<=t;i++) f[i][n]=f[i-1][n]+p*f[i-1][n-1];
    for (int i=1;i<=n;i++) ans+=f[t][i]*i;
    printf("%.7lf",ans);
    return 0;
} 

 

posted @ 2020-05-21 23:32  我亦如此向往  阅读(212)  评论(0编辑  收藏  举报