【BZOJ2576】[JSOI2011]序的计数 (动态规划)

题面

BZOJ

题解

首先构建一个新的虚拟节点连接所有目标节点,强行将其作为第一个被访问的节点,这样子就解决了图不连通的问题。

除了目标节点外,所有其他点都可以缩成一个节点。

这样子的图实际上只有\(k+2\)个节点,\(k+1\)个目标节点。

预处理\(G[S][u]\)表示已经在\(dfs\)序中出现过的点的集合为\(S\),当前在点\(u\)能够访问到的点。

设\(f[S][u]\)表示当前在点\(u\),已经确定\(dfs\)序的集合为\(S\)的\(dfs\)序的方案数。

注意如果一个点和不合法的点有连边,那么这个点不能回朔。

转移的时候枚举一个\(u\)的相邻点,记忆化搜索即可。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define ll long long
#define MAX 120
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
int n,m,K,id[MAX],S[20];
bool g[MAX][MAX],M[20][20];
ll f[1<<19][20];
int G[1<<19][20];
int dfs(int u,int S)
{
if(~G[S][u])return G[S][u];
int ret=1<<u;
for(int i=0;i<K;++i)
if(M[u][i]&&!(S&(1<<i)))ret|=dfs(i,S|(1<<i));
return G[S][u]=ret;
}
ll Solve(int u,int S)
{
if(~f[S][u])return f[S][u];
if(G[S][u]==1<<u)return S==(1<<K)-1||!M[u][K];
ll ret=0;
for(int i=0;i<K;++i)
if(M[u][i]&&!(S&(1<<i)))
ret+=Solve(i,S|(1<<i))*Solve(u,S|G[S|(1<<i)][i]);
return f[S][u]=ret;
}
int main()
{
n=read();m=read();K=read();K+=1;
for(int i=1,u,v;i<=m;++i)u=read(),v=read(),g[u][v]=g[v][u]=1;
for(int i=1;i<=n;++i)id[i]=K;
for(int i=0;i<K-1;++i)S[i]=read(),id[S[i]]=i,M[i][K-1]=M[K-1][i]=1;
for(int i=0;i<=K;++i)
for(int j=1;j<=n;++j)M[i][id[j]]|=g[S[i]][j];
memset(G,-1,sizeof(G));memset(f,-1,sizeof(f));
for(int i=0;i<(1<<K);++i)
for(int j=0;j<K;++j)
if(i&(1<<j))dfs(j,i);
printf("%lld\n",Solve(K-1,1<<(K-1)));
return 0;
}

【BZOJ2576】[JSOI2011]序的计数 (动态规划)的更多相关文章

  1. leetcode-最大子序和(动态规划讲解)

    最大子序和(动态规划讲解) 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4], 输 ...

  2. Leetcode题目53.最大子序和(动态规划-简单)

    题目描述: 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4],输出: 6解释: 连 ...

  3. UOJ#290. 【ZJOI2017】仙人掌 仙人掌,Tarjan,计数,动态规划,树形dp,递推

    原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ290.html 题解 真是一道好题! 首先,如果不是仙人掌直接输出 0 . 否则,显然先把环上的边删光. ...

  4. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  5. Noip前的大抱佛脚----动态规划

    目录 动态规划 序列DP 背包问题 状态压缩以及拆分数 期望概率DP 马尔可夫过程 一类生成树计数问题 平方计数 动态规划 序列DP 有些问题: 求长度为\(l\)的上升子序列个数 形如一个值域的前缀 ...

  6. bzoj1211: [HNOI2004]树的计数 prufer编码

    题目链接 bzoj1211: [HNOI2004]树的计数 题解 prufer序 可重排列计数 代码 #include<bits/stdc++.h> using namespace std ...

  7. 《Cracking the Coding Interview》——第9章:递归和动态规划——题目10

    2014-03-20 04:15 题目:你有n个盒子,用这n个盒子堆成一个塔,要求下面的盒子必须在长宽高上都严格大于上面的.如果你不能旋转盒子变换长宽高,这座塔最高能堆多高? 解法:首先将n个盒子按照 ...

  8. LeetCode初级算法(动态规划+设计问题篇)

    目录 爬楼梯 买卖股票的最佳时机 最大子序和 打家劫舍 动态规划小结 Shuffle an Array 最小栈 爬楼梯 第一想法自然是递归,而且爬楼梯很明显是一个斐波拉切数列,所以就有了以下代码: c ...

  9. 『嗨威说』算法设计与分析 - 动态规划思想小结(HDU 4283 You Are the One)

    本文索引目录: 一.动态规划的基本思想 二.数字三角形.最大子段和(PTA)递归方程 三.一道区间动态规划题点拨升华动态规划思想 四.结对编程情况 一.动态规划的基本思想: 1.1 基本概念: 动态规 ...

随机推荐

  1. Thrift序列化与反序列化

    Thrift序列化与反序列化的实现机制分析 Thrift是如何实现序死化与反序列化的,在IDL文件中,更改IDL文件中的变量序号或者[使用默认序号的情况下,新增变量时,将新增的变量不放在IDL文件的结 ...

  2. 03-命令图片.doc

  3. [转帖]Linux分页机制之概述--Linux内存管理(六)

    Linux分页机制之概述--Linux内存管理(六) 2016年09月01日 19:46:08 JeanCheng 阅读数:5491 标签: linuxkernel内存管理分页架构更多 个人分类: ┈ ...

  4. [转帖]Linux 硬件和系统配置查看命令小结

    https://blog.csdn.net/strongwangjiawei/article/details/8208825 转帖了不少 发现自己记住的还是不多.. Linux 硬件和系统配置查看命令 ...

  5. 将Vue移动端项目打包成手机app---HBuilder

    将移动端页面打包成app 1.使用 HBuilder 直接编译打包 点击左上角 文件>打开目录>选择目录  选择用Webpack打包好的dist文件目录 由于我添加到项目了,所以会显示该项 ...

  6. 建议2---编写pythonic代码

    (1)要避免劣化代码 1)避免只用大小写来区分不同的对象.如a是一个数值类型变量,A是String类型,虽在编码过程容易区分二者的含义,但这样做毫无益处,它不会给其他阅读代码的人带来多少便利. 2)避 ...

  7. python设计模式第二十五天【访问者模式】

    1.应用场景 (1)将数据和行为进行分离,不同的角色具有不同的行为 2.代码实现

  8. jquery和js的几种页面加载函数的方法以及执行顺序

    参考博客:http://www.cnblogs.com/itslives-com/p/4646790.html    https://www.cnblogs.com/james641/p/783837 ...

  9. 深度学习最全优化方法总结比较(SGD,Adagrad,Adadelta,Adam,Adamax,Nadam)(转)

    转自: https://zhuanlan.zhihu.com/p/22252270    ycszen 另可参考: https://blog.csdn.net/llx1990rl/article/de ...

  10. Scss - 简单笔记

    原文链接:scss 教程 手头上疯狂在用 scss,虽然可以在里面写原生的 css, 但是为了保持风格的一致性,还是滚去看了看 scss 文档. 一.变量 变量的引入是 scss 的一个核心特性,变量 ...