題目描述:http://poj.org/problem?id=2096
概率dp簡單題,題目分析參考了這篇:http://www.cnblogs.com/kuangbin/archive/2012/10/02/2710621.html
注意:dp[i][j]表示已經找到i種bug,且屬於j個子程序,還需要的天數的數學期望。
由分析可知:dp[i][j] = (i/n)(j/s)(dp[i][j]+1) + (i/n)((s-j)/s)(dp[i][j+1]+1) + ((n-i)/n)(j/s)(dp[i+1][j]+1) + ((n-i)/n)((s-j)/s)(dp[i+1][j+1]+1)
化簡可得:dp[i][j] = (i*(s-j)*dp[i][j+1] + (n-i)*j*dp[i+1][j] + (n-i)*(s-j)*dp[i+1][j+1] + n*s)/(n*s - i*j)。
另外,搞不明白poj上用GCC提交時得改成%.4f而不能用lf
#include <stdio.h>
#define MAX_N 1002
double dp[MAX_N][MAX_N];
int main(){
int n, s, i, j;
while(scanf("%d%d", &n, &s) != EOF){
dp[n][s] = 0;
for(i = n; i >= 0; i--){
for(j = s; j >= 0; j--){
if(i == n && j == s){
continue;
}
dp[i][j] = (i*(s-j)*dp[i][j+1] + (n-i)*j*dp[i+1][j] + (n-i)*(s-j)*dp[i+1][j+1] + n*s) \
/(n*s - i*j);
}
}
printf("%.4f\n", dp[0][0]);
}
return 0;
}