标签:一个 printf name col space log bug bugs 期望
这道题是最入门的期望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; }
标签:一个 printf name col space log bug bugs 期望
原文地址:http://www.cnblogs.com/Hallmeow/p/7630089.html