POJ3682King Arthur's Birthday Celebration 数学期望DP

POJ3682 King Arthur’s Birthday Celebration

题目链接:[http://poj.org/problem?id=3682]

题目大意:

有一枚硬币抛到正面的概率为 p,每天抛一次,每抛一次要比上一次多消耗 2 MP,要求输出(ans1)抛到 k 次正面的期望天数和(ans2)消耗的 MP 值的期望。

题目分析:

关于期望的题,就是找到递推关系然后DP或者直接找到公式求解。
对于ans1,因为每次抛硬币是独立的事件,与前后都没有影响。每天都有 p 的概率抛到正面,如果只要求抛到一次,那么设期望的天数为X,则p * X = 1 ==> X = 1 / p,推广到多次的情况下则可以得到:ans1 = X * k = 1/p * k = k/p。
对于ans2,可以找出递推关系,再通过递推关系推出公式,对于第 k 次抛到正面需要消耗的MP,存在两种情况:

  1. 抛到正面,概率为p 这种情况下不需要消耗MP
  2. 抛到反面,概率为1-p 这种情况下需要消耗此时期望天数对应的MP

得到递推公式:
F [ k ] = p ⋅ F [ k − 1 ] + ( 1 − p ) ⋅ F [ k ] + 2 ⋅ k p − 1 F[ k ] = p\cdot F[k-1]+(1-p)\cdot F[k]+2\cdot \frac{k}{p}-1 F[k]=pF[k1]+(1p)F[k]+2pk1
将递推公式化简:
p ⋅ F [ k ] = p ⋅ F [ k − 1 ] + 2 ⋅ k p − 1 p\cdot F[k] = p\cdot F[k-1]+2\cdot \frac{k}{p}-1 pF[k]=pF[k1]+2pk1
F [ k ] = F [ k − 1 ] + 2 ⋅ k p 2 − 1 p F[k]=F[k-1]+2\cdot\frac{k}{p^2}-\frac{1}{p} F[k]=F[k1]+2p2kp1
F [ k − 1 ] = F [ k − 2 ] + 2 ⋅ k − 1 p 2 − 1 p F[k-1]=F[k-2]+2\cdot\frac{k-1}{p^2}-\frac{1}{p} F[k1]=F[k2]+2p2k1p1
⋯ ⋯ \cdots \cdots
F [ 2 ] = F [ 1 ] + 2 ⋅ 2 p 2 − 1 p F[2]=F[1]+2\cdot\frac{2}{p^2}-\frac{1}{p} F[2]=F[1]+2p22p1
F [ 1 ] = F [ 0 ] + 2 ⋅ 1 p 2 − 1 p F[1]=F[0]+2\cdot\frac{1}{p^2}-\frac{1}{p} F[1]=F[0]+2p21p1
累 加 得 到 : F [ k ] = F [ 0 ] + 2 p 2 ∑ n = 1 k n − k p       , 其 中 F [ 0 ] = 0 累加得到:F[k]=F[0]+\frac{2}{p^2}\sum _{n=1}^{k}n-\frac{k}{p}\ \ \ \ \ ,其中F[0] = 0 F[k]=F[0]+p22n=1knpk     ,F[0]=0
化 简 之 后 得 到 : F [ k ] = k + k 2 − k p p 2 化简之后得到:F[k]=\frac{k+k^2-kp}{p^2} F[k]=p2k+k2kp

AC代码1:
#include<cstdio>
#include<cstring>
using namespace std;
static const int maxn = 1111;
int k;
double p,DP[maxn];
int main(){
    while(scanf("%d",&k) && k){
        scanf("%lf",&p);
        DP[0] = 0;
        for(int i=1;i<=k;i++)
            DP[i] = DP[i-1]+2*i/(p*p)-1/p;
        printf("%.3f %.3f\n",k/p,DP[k]);
    }
    return 0;
}
AC代码2:
#include<cstdio>
using namespace std;
int k;
double p;
int main(){
    while(scanf("%d",&k) && k){
        scanf("%lf",&p);
        printf("%.3f %.3f\n",k/p,(k+k*k-k*p)/(p*p));
    }
    return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值