您的位置:首页 > 其它

占坑[概率dp] poj 2096 Collecting Bugs

2016-07-21 02:17 453 查看

题目分析

dp[i][j]代表已达到前i和前j,以此为起始到达n、s的期望。

此时,有pi1=in的概率再次选择前i个,qj1=js的概率再次选择前j个,pi2=n−in的概率选择后面n-i个中的一个,qj2=s−js的概率选择后面s-j个中的一个。则dpij=pi1qj1dpij+pi1qj2dpi(j+1)+pi2qj1dp(i+1)j+pi2qj2dp(i+1)(j+1)+1

“+1”要放在外面,而非等式右边每个的dp上。(占坑日后解释)

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<map>
#include<algorithm>
using namespace std;
const double eps=1e-9;
const int maxn = 1003;
int n,s;
double ji;
double dp[maxn][maxn];
int main()
{
while(cin>>n>>s)
{
ji=n*s;
dp
[s]=0;
for(int i=n;i>=0;i--)
for(int j=s;j>=0;j--)
{
if(i==n && j==s) continue;
double x,y;
x=1-i*j/ji;
y=1;
if(i+1<=n) y+=(n-i)*j/ji*dp[i+1][j];
if(j+1<=s) y+=i*(s-j)/ji*dp[i][j+1];
if(i+1<=n && j+1<=s)  y+=(n-i)*(s-j)/ji*dp[i+1][j+1];
dp[i][j]=y/x;
}
printf("%.4f\n",dp[0][0]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  poj dp acm 概率dp