Poj 2096 dp求期望 入門

2022-05-01 11:45:13 字數 1272 閱讀 9485

/

dp求期望的題。

題意:乙個軟體有s個子系統,會產生n種bug。

某人一天發現乙個bug,這個bug屬於某種bug,發生在某個子系統中。

求找到所有的n種bug,且每個子系統都找到bug,這樣所要的天數的期望。

需要注意的是:bug的數量是無窮大的,所以發現乙個bug,出現在某個子系統的概率是1/s,

屬於某種型別的概率是1/n。

解法:dp[i][j]表示已經找到i種bug,並存在於j個子系統中,要達到目標狀態的天數的期望。

顯然,dp[n][s]=0,因為已經達到目標了。而dp[0][0]就是我們要求的答案。

dp[i][j]狀態可以轉化成以下四種:

dp[i][j] 發現乙個bug屬於已經找到的i種bug和j個子系統中

dp[i+1][j] 發現乙個bug屬於新的一種bug,但屬於已經找到的j種子系統

dp[i][j+1] 發現乙個bug屬於已經找到的i種bug,但屬於新的子系統

dp[i+1][j+1]發現乙個bug屬於新的一種bug和新的乙個子系統

以上四種的概率分別為:

p1 = i*j / (n*s)

p2 = (n-i)*j / (n*s)  //找到了 i 種 還剩下(n-i)

p3 = i*(s-j) / (n*s)

p4 = (n-i)*(s-j) / (n*s)

又有:期望可以分解成多個子期望的加權和,權為子期望發生的概率,即 e(aa+bb+...) = ae(a) + be(b) +...

所以:dp[i,j] = p1*dp[i,j] + p2*dp[i+1,j] + p3*dp[i,j+1] + p4*dp[i+1,j+1] + 1;

整理得:

dp[i,j] = ( 1 + p2*dp[i+1,j] + p3*dp[i,j+1] + p4*dp[i+1,j+1] )/( 1-p1 )

= ( n*s + (n-i)*j*dp[i+1,j] + i*(s-j)*dp[i,j+1] + (n-i)*(s-j)*dp[i+1,j+1] )/( n*s - i*j )

#include #include 

using

namespace

std;

double dp[1005][1005

];int

main()

printf(

"%.4lf\n

", dp[0][0

]);

return0;

}

view code

Poj 2096 dp求期望 概率dp

分類 動態規劃 2011 09 14 15 25 1581人閱讀收藏 舉報這題雖然 很簡單,但這是我第一題用dp求數學期望的題目,也算是入個門吧.cpp view plain copy print?dp求期望的題。題意 乙個軟體有s個子系統,會產生n種bug。某人一天發現乙個bug,這個bug屬於某...

POJ2096題解 期望dp

1.有無數個bug 2.將無數個bug分為n種,s類 3.期望意義上,多少天能至少在n種s類裡都找到乙個bug 這道題和hdu4336很像。原子操作 atom operation 為每天找出乙個bug,這個bug 有可能是已找出的i種bug中的一種,這個概率為i n 有可能是已找出的j類bug中的一...

期望入門 PoJ2096 總結

發現圖包根本用不完系列 time limit 10000ms memory limit 64000k total submissions 1485 accepted 647 case time limit 2000ms special judge description input file con...