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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[填坑]期望概率DP 入门级别相关的知识,希望对你有一定的参考价值。

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 入门级别的主要内容,如果未能解决你的问题,请参考以下文章

[填坑]期望概率DP 试炼场

概率DP入门总结 16题(转)

概率DP入门

Poj 2096 (dp求期望 入门)

整理数学期望和概率DP

动态规划数学期望/概率DP/期望DP详解