您的位置:首页 > 其它

hdu4870Rating 概率dp

2015-09-06 13:40 281 查看
//两个账号 , 每次选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 ;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: