CF16E Fish(状压+期望dp)
Posted sdfzsyq
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF16E Fish(状压+期望dp)相关的知识,希望对你有一定的参考价值。
[传送门[(https://www.luogu.org/problemnew/show/CF16E)
解题思路
比较简单的状压+期望。设(f[S])表示(S)这个状态的期望,转移时挑两条活着的鱼打架。时间复杂度(O(2^n*n^2))。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int MAXN = 19;
double a[MAXN][MAXN],f[1<<MAXN],ans[MAXN];
int n;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++) scanf("%lf",&a[i][j]);
f[(1<<n)-1]=1.0;int now;
for(int S=(1<<n)-1;S;S--)if(f[S]){
now=__builtin_popcount(S);
if(now==1){
for(int i=1;i<=n;i++) if((1<<(i-1))&S){
ans[i]=f[S];break;
}
continue;
}
for(int i=1;i<=n;i++)if((1<<(i-1))&S)
for(int j=i+1;j<=n;j++)if((1<<(j-1))&S){
f[S^(1<<(j-1))]+=f[S]*a[i][j]/(now*(now-1)/2);
f[S^(1<<(i-1))]+=f[S]*a[j][i]/(now*(now-1)/2);
}
}
for(int i=1;i<=n;i++) printf("%.6lf ",ans[i]);
return 0;
}
以上是关于CF16E Fish(状压+期望dp)的主要内容,如果未能解决你的问题,请参考以下文章
CF482C Game with Strings (状压DP+期望DP)