牛客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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章