【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; }