误入点分治题单的一个期望dp.
对于这个题来说,我们不妨设置f[i]为i-1分到i分所需要的次数(我们把50分看做1分.),然后他的转移也不难.
对于f[i-1]来说,它可以一步就就到f[i],也可能-2再到f[i],所以概率方程就是:
f[i]=p+(1-p)*(1+f[i-2]+f[i-1]+f[i]). ->f[i]=1+((1-p)/p)*(1+f[i-2]+f[i-1]).
嗦嘎,如此这个题目就完成了,ans=tot(f[1...20])-f[20].因为答案必定是950,1000的形式.
然后关于初值,也是看这个方程得到的,因为f[0]=0和f[-1]不存在可以看成0,所以f[1]=1/p.然后同理f[2]=1/(p*p).
代码如下:
#include <bits/stdc++.h>
using namespace std;
const int N=25;
double f[N];
int main()
{
double p;
while(cin>>p)
{
double tot=0;
f[1]=1/p;f[2]=1/(p*p);
tot+=f[1]+f[2];
for(int i=3;i<=20;i++)
{
f[i]=1+((1-p)/p)*(1+f[i-2]+f[i-1]);
tot+=f[i];
}printf("%.6f\n",tot*2-f[20]);
}return 0;
}
京公网安备 11010502036488号