状态压缩DP
status{x1,x2,x3,x4,………xn-1,xn}表示每只鱼是否还活着的状态 xi=1表示第i条鱼还活着 xi=0表示第i条鱼已经被吃掉了 dp(status)表示形成status这种状态的概率 那么刚开始的时候(第一天),所有的鱼都活着。 那么dp({1,1,1,1….,1,1,1})=1。
学长的AC的代码:
#include <cstdio>
#include <cstring>
double dp[1<<18];
double mat[18][18];
int bitcount(int t){
    int ret = 0;
    while(t){
        ret += t&1;
        t >>= 1;
    }
    return ret;
}
int main(){
    int n;
    scanf("%d",&n);
    for(int i = 0;i < n;i++){
        for(int j = 0;j < n;j++){
            scanf("%lf",&mat[i][j]);
        }
    }
    dp[(1<<n)-1] = 1;
    for(int i = (1<<n)-1;i >= 1;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(i&(1<<j)){
            for(int k = 0;k < n;k++)if(i&(1<<k)){
                dp[i^(1<<k)] += p*mat[j][k];
            }
        }
    }
    for(int i = 0;i < n;i++){
        printf("%.6f ",dp[1<<i]);
    }
    return 0;
}
dp[(1<<n)-1] = 1; 
//看似不起眼的小动作居然是将这个数组完全初始化为1的操作,值得参考
//每一步的概率应当是保存在p这个值当中
double dp[1<<18]; //这个是最后一步的计算结果
double mat[18][18];			//用来保存概率
 
                     
                    
                 
                    
                 
 
         
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号