状态压缩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]; //用来保存概率