POJ 3557 Map Generator [概率DP]
给出N个点,生成每条边的概率是pi,问生成一幅连通图的期望。
一开始正着想,感觉很复杂,无从下手,看了题解才发现原来是反过来思考的。。d[i]表示生成i个点的连通图的概率,那只要求出对应的不连通的概率,然后一减就可以了。生成不连通图的情况,就是从i-1个点中,选出1~n-1个点,选出的点和i连通而和其它点不连通,把所有的概率加起来就是生成不连通图的概率。。
1 #include <string.h> 2 #include <stdio.h> 3 #include <math.h> 4 int n; 5 double p, d[30], c[31][31]; 6 void init(){ 7 for (int i = 0; i < 31; c[i++][0] = 1) 8 for (int j = 1; j <= i; j++) 9 c[i][j] = c[i-1][j-1] + c[i-1][j]; 10 } 11 int main(){ 12 init(); 13 while (scanf("%d%lf", &n, &p) != EOF) { 14 for (int i = 1; i <= n; i++) { 15 double tmp = 0; 16 for (int j = 1 ; j < i; j++) { 17 tmp += c[i-1][j-1]*d[j]*pow(1-p,j*(i-j)); 18 } 19 d[i] = 1 - tmp; 20 } 21 printf("%.10f\n",d[n]); 22 } 23 return 0; 24 }