CodeForces 16E

状态压缩 动态规划

DP[111.....1]=1表示所有鱼都在的几率为1

0代表已经挂了的,1代表没挂;

#include "stdio.h"
#define max 1<<18
double a[18][18],dp[max];
int bitcount(unsigned x)
{
    int b;
    for (b = 0; x != 0; x &= (x-1))
        b++;
    return b;
}
int main(){
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++)
            scanf("%lf",&a[i][j]);
    }
    //printf("%lf ",a[n-1][n-1]);
    int nn=(1<<n)-1;
    dp[nn]=1;
    for(int i=nn;i>0;i--){
        int bit=bitcount(i);
        if(bit==1)continue;
        double p=2*dp[i]/bit/(bit-1);
        for(int j=0;j<n;j++){
            if((1<<j)&i){
                for(int k=0;k<n;k++)
                    if(i&(1<<k)){
                        dp[i^(1<<k)] += p*a[j][k];
                    }
            }
        }
    }
    for(int i=0;i<n;i++){
        printf("%.6f ",dp[(1<<i)]);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/Mr-Xu-JH/p/3871986.html