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;
}

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

时间: 2024-08-28 20:21:23

CF16E Fish(状压+期望dp)的相关文章

uva11600 状压期望dp

一般的期望dp是, dp[i] = dp[j] * p[j] + 1; 即走到下一步需要1的时间,然后加上 下一步走到目标的期望*这一步走到下一步的概率 这一题,我们将联通分块缩为一个点,因为联通块都是安全的 dp[u][s] 为当前在u,走过的联通块为s的期望天数 那么走到剩下没有走过的连通块的概率是   (n-have)/(n-1),  那么平均需要的时间是  (n-1)/(n-have), 走到下一个没有走过的连通块的概率为cnt[i] / (n-have) 所以dp[u][s] = (n

BZOJ 1076 奖励关(状压期望DP)

当前得分期望=(上一轮得分期望+这一轮得分)/m dp[i,j]:第i轮拿的物品方案为j的最优得分期望 如果我们正着去做,会出现从不合法状态(比如前i个根本无法达到j这种方案),所以从后向前推 如果当前方案j里具备了取k这个物品的条件 那么dp[i,j]+=max{dp[i+1,j],dp[i+1,j  or  1<<(k?1)]+x[k]} 否则dp[i,j]+=dp[i+1,j] #include<cstdio> #include<iostream> using n

P2473 || SCOI2008 奖励关 //状压&amp;&amp;期望DP

https://www.luogu.org/problemnew/show/P2473 一句话题意:有n种宝物,捡起会有得分(可能为负),有k轮可以捡起宝物.其中有些宝物,需要另外的宝物捡起过才能捡起. 问采取最优策略的期望得分. 解:期望的最大特点在于难写的递推式和倒序DP 但这道题没那么恶心,递推式还是挺好写的(指看完题解之后可以自己写出DP式子) f[i][S]表示在第1轮到第i-1轮内宝物是否取过的状态为S,第i轮到第K轮的最大期望得分 f [ i ][ S ] 在S满足时可以取或不取

P2473 [SCOI2008]奖励关(状压+期望dp)

题目描述 你正在玩你最喜欢的电子游戏,并且刚刚进入一个奖励关.在这个奖励关里,系统将依次随机抛出k次宝物,每次你都可以选择吃或者不吃(必须在抛出下一个宝物之前做出选择,且现在决定不吃的宝物以后也不能再吃). 宝物一共有n种,系统每次抛出这n种宝物的概率都相同且相互独立.也就是说,即使前k-1 次系统都抛出宝物1(这种情况是有可能出现的,尽管概率非常小),第k次抛出各个宝物的概率依然均为1/n. 获取第 i 种宝物将得到Pi分,但并不是每种宝物都是可以随意获取的.第i种宝物有一个前提宝物集合Si.

SPOJ BALNUM Balanced Numbers 状压+数位DP

一开始想了一个用二进制状压的方法,发现空间需要的太大,光光memset都要超时 = = 其实不用每次都memset 也可以用三进制,一开始直接打表出所有的状态转移就好 #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <climits> #include <string> #include <iostream&g

HDU 4336 Card Collector(状压 + 概率DP 期望)题解

题意:每包干脆面可能开出卡或者什么都没有,一共n种卡,每种卡每包爆率pi,问收齐n种卡的期望 思路:期望求解公式为:$E(x) = \sum_{i=1}^{k}pi * xi + (1 - \sum_{i = 1}^{k}pi) * [1 + E(x)]$,即能转换到x情况的期望+x情况原地踏步的期望. 因为n比较小,我们可以直接状压来表示dp[x]为x状态时集齐的期望.那么显然dp[111111111] = 0.然后我们状态反向求解.最终答案为dp[0]. 然后来看期望的求解:$E(x) =

UVA 11600 Masud Rana 并查集+状压概率dp

题目链接:点击打开链接 题意:给定一个无向图,给定的边是已经存在的边,每天会任选两个点新建一条边(建过的边还会重建) 问:使得图连通的天数的期望. 思路:状压喽,看别人都是这么写的,n=30,m=0 我也不知道怎么办了.. 当前连通块点数为X 加入一个Y个点的连通块需要的天数为 Y/(n-X); Masud Rana, A Daring Spy Of Bangladesh Counter Intelligence. He is in a new mission. There is a total

codeforces 482c 状压+概率DP

题意:给出N个不同的串,长度一样,别人随机选一个串,你要询问他那个串某一个位置是什么字符直到能确定那个串才能停止,问询问次数的期望. 题解:50个串20个位置容易想到状压,把字符串长度状压先考虑能否在某一个状态确定哪些字符串能确定哪些不能确定,需要2^m*m次,然后时间上不能再乘以n不然会爆,想想只要我知道到达某一个猜位置状态的概率dp[i],再知道相对应有哪些字符串可以确定和不可以确定,用f[i]来表示,那么对于不能确定的字符串相当于就要再猜一步,那么加上这个状态的概率就行了,不会再需要乘以n

lightoj-1021 - Painful Bases(状压+数位dp)

1021 - Painful Bases PDF (English) Statistics ForumTime Limit: 2 second(s) Memory Limit: 32 MBAs you know that sometimes base conversion is a painful task. But still there are interesting facts in bases. For convenience let's assume that we are deali