误入点分治题单的一个期望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;
}