rt,在昨天ABC的E,我按照期望dp的套路写了段玄学代码,主要内容是:
int n=read(),p=read();
f[n]=0,f[n-1]=1;
for(int i=n-2;i>=0;i--){
f[i]=((f[i+2]*p
+f[i+1]*(100-p))%mod*inv(100)%mod
+1)%mod;
}
cout<<f[0]<<endl;
然后它过了。
但是我不知道这个算法是怎么进行的。我能理解的dp是,定义到达点 d 的概率为 pd,期望为 ed,并假设攻击为 2 的概率为 p ,那么下面的表达式在 d>0 时候成立: pd=p(pd+2)+(1−p)(pd+1)
ed=pdp(pd+2)ed+2+(1−p)(pd+1)ed+1
总的代码长这样(马蜂很丑)
n=read(),pp=read();
e[n]=0,p[n]=1;
per(i,n-1,1){
p[i]=(100-pp)*p[i+1]+pp*p[i+2];
p[i]=p[i]%mod*inv(100)%mod;
e[i]=(100-pp)*p[i+1]%mod*e[i+1]+pp*p[i+2]%mod*e[i+2];
e[i]=(e[i]%mod*inv(100)%mod*inv(p[i])+1)%mod;
}
p[0]=100*p[1]+pp*p[2];
p[0]=p[0]%mod*inv(100)%mod;
e[0]=100*p[1]%mod*e[1]+pp*p[2]%mod*e[2];
e[0]=(e[0]%mod*inv(100)%mod*inv(p[0])+1)%mod;
cout<<e[0]<<endl;
然后它也过了。
所以第一段代码正确的原理是什么(或者说第一段代码中f
表示的状态是什么意思)?求解。