码迷,mamicode.com
首页 > 其他好文 > 详细

CF16E Fish(状压+期望dp)

时间:2018-12-01 22:11:15      阅读:243      评论:0      收藏:0      [点我收藏+]

标签:ons   ble   传送门   代码   --   algo   turn   using   http   

[传送门[(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)

标签:ons   ble   传送门   代码   --   algo   turn   using   http   

原文地址:https://www.cnblogs.com/sdfzsyq/p/10050891.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!