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 }

 

posted @ 2012-09-21 22:12  Burn_E  阅读(285)  评论(0编辑  收藏  举报