Poj 2096 dp求期望 概率dp

2021-06-18 16:30:30 字數 4380 閱讀 4641

分類: 動態規劃

2011-09-14 15:25

1581人閱讀收藏 

舉報這題雖然**很簡單,但這是我第一題用dp求數學期望的題目,也算是入個門吧...

[cpp]view plain

copy

print?

/**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)

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];  

intmain()  

printf("%.4lf\n"

, dp[0][0]);  

return

0;  

}  

分類: 動態規劃

2011-09-14 20:23

1376人閱讀收藏 

舉報遊戲c

第二個dp求數學期望的題,如果看不懂,請看我的第乙個dp求期望的題(poj 2096)

令 f[i][j] 表示已經找到了 i 種 bug,且 j 個子系統至少包含乙個 bug,距離完成目標需要的時間的期望。

目標狀態是 f[0][0]

再過一天找到乙個 bug 可能是如下的情況:

1. 這個 bug 的種類是 已經找到的 並且 出現在 已經找到 bug 的子系統中

2. 這個 bug 的種類是 已經找到的 並且 出現在 沒有找到 bug 的子系統中

3. 這個 bug 的種類是 沒有找到的 並且 出現在 已經找到 bug 的子系統中

4. 這個 bug 的種類是 沒有找到的 並且 出現在 沒有找到 bug 的子系統中

[cpp]view plain

copy

print?

/**dp求期望的題。

題意:有三個均勻的骰子,分別有k1,k2,k3個面,初始分數是0,

當擲三個骰子的點數分別為a,b,c的時候,分數清零,否則分數加上三個骰子的點數和,

當分數》n的時候結束。求需要擲骰子的次數的期望。

題解:設 e[i]表示現在分數為i,到結束遊戲所要擲骰子的次數的期望值。

顯然 e[>n] = 0; e[0]即為所求答案;

e[i] = ∑pk*e[i+k] + p0*e[0] + 1; (pk表示點數和為k的概率,p0表示分數清零的概率)

由上式發現每個 e[i]都包含 e[0],而 e[0]又是我們要求的,是個定值。

設 e[i] = a[i]*e[0] + b[i];

將其帶入上面的式子:

e[i] = ( ∑pk*a[i+k] + p0 )*e[0] + ∑pk*b[i+k] + 1;

顯然,a[i] = ∑pk*a[i+k] + p0;

b[i] = ∑pk*b[i+k] + 1;

當 i > n 時:

e[i] = a[i]*e[0] + b[i] = 0;

所以 a[i>n] = b[i>n] = 0;

可依次算出 a[n],b[n]; a[n-1],b[n-1] ... a[0],b[0];

則 e[0] = b[0]/(1 - a[0]);

**/#include 

#include 

#include 

using

namespace

std;  

intmain()  

double

a[520] = , b[520] = ;  

for(

inti = n; i >= 0; i--)  

a[i] += p0;  

b[i] += 1;  

}  printf("%.15lf\n"

, b[0]/(1 - a[0]) );  

}  return

0;  

}  

分類: 動態規劃

2011-09-14 15:25

1580人閱讀收藏 

舉報這題雖然**很簡單,但這是我第一題用dp求數學期望的題目,也算是入個門吧...

[cpp]view plain

copy

print?

/**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)

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];  

intmain()  

printf("%.4lf\n"

, dp[0][0]);  

return

0;  

}  

Poj 2096 dp求期望 入門

dp求期望的題。題意 乙個軟體有s個子系統,會產生n種bug。某人一天發現乙個bug,這個bug屬於某種bug,發生在某個子系統中。求找到所有的n種bug,且每個子系統都找到bug,這樣所要的天數的期望。需要注意的是 bug的數量是無窮大的,所以發現乙個bug,出現在某個子系統的概率是1 s,屬於某...

POJ2096題解 期望dp

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

poj2096 概率dp入門

題意 乙個系統有s個子系統,一共會產生n中bug。某人一天可以發現乙個bug,這個bug屬於乙個子系統,屬於乙個種類,每個bug屬於某個子系統的概率是1 s,屬於某個分類的概率是1 n,問發現n種bug並且每個子系統都發現bug的天數的期望。分析 簡單的入門概率dp,在這之前沒有做個這個型別,所以講...