hdu4870Rating 概率dp

来源:互联网 发布:站长之家端口检测工具 编辑:程序博客网 时间:2024/06/18 18:02
//两个账号 , 每次选rating小的去比赛 //每次比赛rating可能加50 , 可能减100(最多剪到0) //问刚开始两个比赛的rating都为0 到其中一个账号大于1000的期望//只考虑一个账号情况 ,// dp[0] = p*dp[1] + (1-p)dp[0] + 1  <==> dp[0] = dp[1] + 1/p// dp[1] = p*dp[2] + (1-p)dp[0] + 1  <==> dp[2] = dp[1] + 1/(p*p) = dp[0] + 1/p + 1/(p*p)// 设 dp[k] = dp[0] + t[k]    t[k]表示从0到k的期望值// dp[k] = p*dp[k+1] + (1-p)dp[k-2] + 1 ;//所以  t[k+1]=1/p+1/p*t[k]-(1-p)/p*t[k-2]//边界条件是  t[0]=0,t[1]=1/p,t[2]=1/p+1/p^2//考虑两个账号 , 必然是(0,0) ==> (0 , 1) ==> (1 , 1) ==>(1 , 2) ... ==> (19 , 20)//其期望值为                t[1] - t[0]  t[1]-t[0]    t[2] - t[1]    t[20] - t[19]//加起来为        t[19] + t[20] - 2*t[0]#include<cstdio>#include<iostream>#include<cstring>using namespace std ;const int maxn = 30 ;double t[maxn] ;int main(){    double p ;    while(~scanf("%lf" , &p))    {        t[0] = 0 ;        t[1] = 1.0/p ;        t[2] = 1.0/p + 1.0/(p*p) ;        for(int i = 3;i <= 20;i++)        t[i] = 1.0/p + 1.0/p*t[i-1] - (1.0-p)*t[i-3]/p ;        printf("%.6lf\n" , t[19] + t[20]) ;    }    return 0 ;}

0 0
原创粉丝点击