牛客Talk(概率dp)

题目描述
众所周知,牛可乐 的口胡能力十分强大.牛可乐 要讲 n 件事情,我们把这些事情从 1∼n 标号。牛可乐每讲一件事需要耗费一个单位的时间,但是 牛可乐讲事情和普通人不同:牛可乐在 讲完 第 i 件事时,只有 pi 的概率继续讲下一件事(第 i+1 件),也就是说,牛可乐讲完第 i 件事后有 (1-pi) 的概率从第 i-1 件事开始讲!
当 牛可乐讲完第 n 件事,并且决定讲下一件事时,牛可乐才算是把这 n 件事讲完了。
牛妹是个不耐烦的女孩子,她想问问你 牛可乐期望要讲多久才能把 n 件事情全部讲完。
输入描述:
第一行一个整数 n
第二行 n 个浮点数,代表 pi,保证 p1 = 1
输出描述:
一行一个浮点数,表示 牛可乐期望要多久才能把全部事情讲完(保留到小点后 3 位)

输入
4
1 0.6 0.4 0.2

输出
38.333

  • 由题意可以得出方程d[i] = p[i-1] *(dp[i-1]+1)+(1-p[i-1]) *(dp[i-1]+1+dp[i]-dp[i-2])
  • 即dp[i] = 概率命中*(上一步的期望值+1)+概率未命中*(上一步的期望值+1+退回到上上一步到这一步的期望值)
  • 化简可以得到dp[i] =(dp[i-1]+1+(p[i-1]-1)*dp[i-2])/p[i-1]
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+9;
double dp[1200],p[1200];

int main()
{
    long long i,j,m,n;
    scanf("%lld",&n);
    for(i = 0;i<n;i++)
    {
        scanf("%lf",&p[i]);
    }
    dp[1] = 1;
    for(i = 2;i<=n;i++)
    {
        dp[i] =(dp[i-1]+1+(p[i-1]-1)*dp[i-2])/p[i-1];
    }
    printf("%.3lf\n",dp[n]);

    return 0;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值