1. 程式人生 > >[填坑]期望概率DP 入門級別

[填坑]期望概率DP 入門級別

using pri == ble for ostream cst space 入門級

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 入門級別