您的位置:首页 > 其它

POJ 2096 Collecting Bugs (概率DP入门)

2015-07-10 23:32 417 查看
今天看了kuangbin博客里的概率DP总结/content/3596333.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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: