题目:
http://poj.org/problem?id=2096
一个软件有 s s s个子系统,会产生 n n n种 b u g bug bug。某人一天能够发现一个 b u g bug bug,这个 b u g bug bug属于一个子系统的概率为 1 s \frac{1}{s} s1,属于某一类 b u g bug bug的概率为 1 n \frac{1}{n} n1。问发现 n n n种 b u g bug bug,并且每个子系统也都发现 b u g bug bug的天数的期望。
思路:
d
p
[
i
]
[
j
]
dp[i][j]
dp[i][j]表示已经找到
i
i
i种
b
u
g
bug
bug,并且这些
b
u
g
bug
bug属于
j
j
j个系统,达到目标状态的天数的期望。有
d
p
[
i
]
[
j
]
=
1
+
i
n
∗
j
s
d
p
[
i
]
[
j
]
+
i
n
∗
s
−
j
s
d
p
[
i
]
[
j
+
1
]
+
n
−
i
n
∗
j
s
d
p
[
i
+
1
]
[
j
]
+
n
−
i
n
∗
s
−
j
s
d
p
[
i
+
1
]
[
j
+
1
]
(
1
−
i
∗
j
s
∗
n
)
∗
d
p
[
i
]
[
j
]
=
1
+
i
n
∗
s
−
j
s
d
p
[
i
]
[
j
+
1
]
+
n
−
i
n
∗
j
s
d
p
[
i
+
1
]
[
j
]
+
n
−
i
n
∗
s
−
j
s
d
p
[
i
+
1
]
[
j
+
1
]
\begin{aligned} dp[i][j]&=1+\frac{i}{n}*\frac{j}{s}dp[i][j]+\frac{i}{n}*\frac{s-j}{s}dp[i][j+1]\\ &+\frac{n-i}{n}*\frac{j}{s}dp[i+1][j]+\frac{n-i}{n}*\frac{s-j}{s}dp[i+1][j+1]\\ (1-\frac{i*j}{s*n})*dp[i][j]&=1+\frac{i}{n}*\frac{s-j}{s}dp[i][j+1]+\frac{n-i}{n}*\frac{j}{s}dp[i+1][j]\\ &+\frac{n-i}{n}*\frac{s-j}{s}dp[i+1][j+1]\\ \end{aligned}
dp[i][j](1−s∗ni∗j)∗dp[i][j]=1+ni∗sjdp[i][j]+ni∗ss−jdp[i][j+1]+nn−i∗sjdp[i+1][j]+nn−i∗ss−jdp[i+1][j+1]=1+ni∗ss−jdp[i][j+1]+nn−i∗sjdp[i+1][j]+nn−i∗ss−jdp[i+1][j+1]
d
p
[
n
]
[
s
]
=
0
dp[n][s]=0
dp[n][s]=0
#include"cstdlib"
#include"cstdio"
#include"cstring"
#include"cmath"
#include"queue"
#include"algorithm"
#include"iostream"
#define eps 1e-5
using namespace std;
double dp[1020][1020];
int main()
{
int n,s;
while(cin>>n>>s)
{
memset(dp,0,sizeof(dp));
for(int i=n; i>=0; i--)
{
for(int j=s; j>=0; j--)
{
if(i==n&&j==s) continue;
double tep=1.0;
if(i<n) tep+=(n*1.0-i)*j/(n*s)*dp[i+1][j];
if(j<s) tep+=(s*1.0-j)*i/(n*s)*dp[i][j+1];
if(i<n&&j<s) tep+=(n*1.0-i)*(s*1.0-j)/(n*s)*dp[i+1][j+1];
dp[i][j]=tep/(1-(i*j*1.0)/(s*n));
}
}
printf("%.4f\n",dp[0][0]);
}
return 0;
}