CF16E Fish(概率dp+状压dp)

来源:互联网 发布:入骨相思知不知福禄txt 编辑:程序博客网 时间:2024/06/05 06:20

这题好像思路还是很简单的。。。概率推了一会。。。太弱了。。。

#include <bits/stdc++.h>using namespace std;#define ll long long#define inf 0x3f3f3f3f#define N 20inline int read(){    int x=0,f=1;char ch=getchar();    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}    while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();    return x*f;}int n,bin[N];double a[N][N],dp[300000];int main(){//  freopen("a.in","r",stdin);    n=read();bin[0]=1;    for(int i=1;i<=n;++i) bin[i]=bin[i-1]<<1;dp[bin[n]-1]=1;    for(int i=0;i<n;++i)        for(int j=0;j<n;++j) scanf("%lf",&a[i][j]);    for(int s=bin[n]-1;s>=1;--s){        int tot=0;for(int i=0;i<n;++i) if(s&bin[i]) tot++;        if(tot==1) continue;double t=2.0/(tot*(tot-1));        for(int i=0;i<n;++i){            if((s&bin[i])==0) continue;            for(int j=i+1;j<n;++j){                if((s&bin[j])==0) continue;                dp[s-bin[i]]+=a[j][i]*dp[s]*t;                dp[s-bin[j]]+=a[i][j]*dp[s]*t;            }        }    }    for(int i=0;i<n;++i) printf("%.6f ",dp[bin[i]]);    return 0;}
原创粉丝点击