码迷,mamicode.com
首页 > 其他好文 > 详细

[填坑]期望概率DP 入门级别

时间:2017-10-05 22:35:38      阅读:195      评论:0      收藏:0      [点我收藏+]

标签:一个   printf   name   col   space   log   bug   bugs   期望   

poj 2096 Collecting Bugs 期望DP

这道题是最入门的期望DP,然而我并不是很会做,甚至连题都没看懂。。(其实是English不好 相信我)

题解:

在这里有s,n两个变量,假设dp[i][j]表示已经发现i种bug存在j个系统到期望天数所需要的天数,

显然dp[n][s]=0;  

从dp[i][j]经过一天后可能得到以下四种情况: 

dp[i][j]->dp[i+1][j+1];   在一个新的系统里面发现一个新的bug 

dp[i][j]->dp[i+1][j];   在原来已发现过bug的系统里发现一个新的bug 

dp[i][j]->dp[i][j+1];   在一个新的系统里面发现一个已被发现过的bug 

dp[i][j]->dp[i][j];   在已发现过bug的系统发现已发现过的bug  

四种到达的概率分别是: 

p1=(n-i)*(s-j)/(n*s); 

p2=(n-i)*j/(n*s); 

p3=i*(s-j)/(n*s); 

p4=i*j/(n*s); 

所以dp[i][j]=p1*dp[i+1][j+1]+p2*dp[i+1][j]+p3*dp[i][j+1]+p4*dp[i][j]+1

推一下就是 dp[i][j]=(p1*dp[i+1][j+1]+p2*dp[i+1][j]+p3*dp[i][j+1]+1)/(1-p4); 

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define pos(i,a,b) for(int i=(a);i<=(b);i++)
#define pos2(i,a,b) for(int i=(a);i>=(b);i--) 
#define N 1010
double n,s;
double dp[N][N];
int main(){
	scanf("%lf%lf",&n,&s);
	pos2(i,n,0){
		pos2(j,s,0){
			if(i==n&&j==s) continue;
			dp[i][j]=((dp[i+1][j]*(n-i)*(j)+dp[i][j+1]*(i)*(s-j)+dp[i+1][j+1]*(n-i)*(s-j))/(n*s)+1)/(1-(i*j)/(n*s));
		}
	}
	printf("%.4lf",dp[0][0]);
	return 0;
} 

  

 

[填坑]期望概率DP 入门级别

标签:一个   printf   name   col   space   log   bug   bugs   期望   

原文地址:http://www.cnblogs.com/Hallmeow/p/7630089.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!