今天看了kuangbin博客里的概率DP总结http://www.cnblogs.com/kuangbin/archive/2012/10/02/2710606.html
开始的一句话感觉很有道理(概率正推,期望逆推)【不过谁能给我详细讲一下,现在只是感觉上很有道理
设dp[i][j]为已找到i种bug和j个subconponent后到达目标的期望。
那么dp[i][j] 可以转化成四种状态:
dp[i][j] + 1 概率:i*j / n / s
dp[i+1][j] + 1 概率: (n-i)*j / n / s
dp[i][j+1] + 1 概率:i*(s-j) / n / s
dp[i+1][j+!] + 1 概率: (n-i)*(s-j) / n / s
代码:
#include<cstdio>
#include<iostream>
using namespace std;
const int maxn = 1005;
int n,s;
double dp[maxn][maxn];
int main(){
scanf("%d%d",&n,&s);
for(int i = n ;i >= 0; i--){
for(int j = s; j >= 0; j--){
if(i == n && j == s) continue;
dp[i][j] = (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);
}
}
printf("%.4f\n",dp[0][0]);
return 0;
}