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

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