题目描述: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;
}