HDU4917 Permutation

ZJU1346 Comparing Your Heroes - 拓扑排序的计数★ 题目描述:某人要对拳皇的人物做一个排序。输入一个N,接下来N行每行两个字符串A B,表示A比B厉害。要求一共有多少种不同的拓扑排序方法。若不能完成排序输出0。 分析:可以用动态规划来解决。对于n个节点进行拓扑排序,设当前有m个度为0的节点,记为Zi。所以当前可以选择这m个度为0的节点中的任意一个排在前面,剩下的节点有多少种排序方法与之前无关。所以可以用节点集合表示状态。状态 阅读详情

题目描述

bobo has a permutation p1,p2,...,pnp1,p2,...,pn of 1,2,...,n1,2,...,n.
Knowingmmextra constraints of form pai<pbi, bobo wanna count the number of different permutations modulo 109+7109+7.
It is guaranteed that there is at least one such permutation.

给出一个全排列中满足的若干约束,让你求在这个约束下满足条件的排列个数。

约定

1≤n≤40,0≤m≤201≤n≤40,0≤m≤20

分析

PART 1 转化

我们可以把一个数看成一个点,对于一个约束关系就从一个点到另一个点连一条有向边。由于题目保证有解,我们会得到一个DAG(不一定全部连通,是若干个连通块组成的)。那么我们的问题就变成了对于这若干个连通块,求它们的拓扑排序计数。

PART 2 计数

由于是对一个图的计数,还会涉及到图上一些复杂的关系,我们并不方便直接推出式子计算。考虑mm较小,那么对于一个连通块最多是20条边,21个点,我们可以使用状态压缩的方式,计算已经安排好集合S中的点的方案数(保证SS合法)。那么对每个连通块这样计数,最后再进行合并。

参考程序

// vjudge 244023 F
// HDU4917
#include <cstdio>
#include <cstring>
typedef long long LL;
const int MAXN = 45;
const int MAXS = (1 << 21) + 5;
const int MOD = 1000000007;
struct Edge {
    int to, next;
} E[MAXN];

int C[MAXN][MAXN], tote, N, M, last[MAXN], fa[MAXN], mark[MAXN], comp[MAXN], prv[MAXN], DP[MAXS];

inline void add_edge(int u, int v) { E[++tote].to = u, E[tote].next = last[v], last[v] = tote; }
inline void plus(int & x, int d) { x = (x + d) % MOD; }
int find(int x) {
    if (fa[x] == x) return x;
    return fa[x] = find(fa[x]);
}
void init();
void solve();

int main() {
    init();
    while (scanf("%d%d", &N, &M) == 2) solve();
    return 0;
}

void init() {
    int i, j;
    for (C[0][0] = i = 1; i <= 40; i++)
        for (C[i][0] = j = 1; j <= i; j++) C[i][j] = (C[i - 1][j - 1] + C[i - 1][j]) % MOD;
}

void solve() {
    memset(last, 0, sizeof(last));  // 邻接表初始化
    int i, j, k, stat, lim_stat, ai, bi, f1, f2;
    for (i = 1; i <= N; i++) fa[i] = i;
    for (i = tote = 0; i < M; i++) {
        scanf("%d%d", &ai, &bi);
        add_edge(ai, bi);
//      并查集维护连通块信息
        f1 = find(ai), f2 = find(bi);
        if (f1 != f2) fa[f1] = f2;
    }
    int res = 1, tot = N, size;
//  res记录结果,tot存储排列上剩下可供选择的位置,size存储当前连通块的大小
    for (i = 1; i <= N; i++)
        if (fa[i] == i) {
            for (j = 1, size = 0; j <= N; j++)
                if (find(j) == i) mark[j] = size, comp[size++] = j;     // mark记录点对应连通块中的相对编号
            if (size <= 2) { res = (LL)res * C[tot][size] % MOD; tot -= size; continue; }   // size小于等于2那么只有1中方案
            for (j = 0; j < size; j++)
                for (prv[j] = 0, k = last[comp[j]]; k; k = E[k].next) prv[j] |= 1 << mark[E[k].to]; // 预处理出必须先遍历的前驱,压缩
            for (DP[0] = 1, stat = 1, lim_stat = 1 << size; stat < lim_stat; ++stat)
                for (DP[stat] = 0, j = 0; j < size; j++)
                    if (stat >> j & 1 && prv[j] == (prv[j] & (stat & ~(1 << j)))) plus(DP[stat], DP[stat & ~(1 << j)]);    // 这里注意不要漏了==后的括号!==优先级高于&
            res = (LL)res * C[tot][size] % MOD * DP[lim_stat - 1] % MOD;
            tot -= size;
        }
    printf("%d\n", res);
}

总结

这道题的转化十分巧妙。转化之后对于计数的处理也需要较高的技巧,一环紧扣一环,是一道好题。回想当年的多校,题面还是那么简洁清晰,不像现在一堆废话还有语法错误。

Jetson Orin边缘语音AI实战:用Riva ASR/TTS + Llama 2打造离线智能语音助手 本文详细介绍了如何利用NVIDIA Jetson Orin的边缘计算能力,结合Riva ASR/TTS语音引擎和Llama 2大语言模型,构建完全离线的智能语音助手。通过硬件优化、量化部署和性能调优,实现在网络不稳定环境下的高效语音交互,适用于智能家居、车载系统等场景。 阅读详情

相关推荐

多模态特征融合方法总结

由于本人的研究是文本、语音和图像三者模态数据的融合,所以针对的是这三种模态的特征融合方法进行总结。 首先,多模态特征融合的方法大体分为三种

华辰烟雨的博客 9万+

HDU 4917 Permutation(拓扑排序 + 状压DP + 组合数)

题目链接 Permutation 题目大意:给出n,和m个关系,每个关系为ai必须排在bi的前面,求符合要求的n的全排列的个数。 数据规模为n <= 40,m <= 20。 直接状压DP空间肯定是不够的。 考虑到m <= 20,说明每个连通块的大小不超过21。 那么我们分别对每个连通块求方案数,并且把不同的连通块的方案数组合起来即可。 #include <bi...

weixin_30807677的博客 179

逆向拆解Android车机:VehicleHal如何通过HIDL与CarService通信?

本文深入剖析了Android Automotive OS中VehicleHal与CarService通过HIDL进行通信的底层机制。从逆向工程视角出发,详细介绍了如何捕获和分析HIDL调用日志,解析关键属性数据结构,并演示了利用SocketComm工具进行恶意属性注入攻击的实战路径,为车机系统安全评估提供了技术参考。

soda5的博客 720

hdu4917 Permutation(拓扑排序+状压DP)

bobo has a permutation p 1,p 2,…,p n of 1,2,…,n. Knowing m extra constraints of form p ai 思路: 最开始一直在想容斥原理,把每个限制条件不符合的情况减去,再把两个一起不符合的加上…然而根本不会实现,情况太多了。 后来看了题解,实际上可以将这一题的题意简化成求DAG的拓扑序列数量。好像瞬间简单了好多!...

xyyxyyx的博客 530

Android SDK安装教程(超详细),从零基础入门到精通,从这篇开始_android sdk下载安装

Android SDK安装教程(超详细),从零基础入门到精通,从这篇开始_android sdk下载安装

Jinmindong 5010

FlexibleButton嵌入式按键处理方案设计与实现

嵌入式系统中的按键处理是基础且关键的人机交互技术,其核心原理是通过GPIO电平检测结合状态机实现事件识别。FlexibleButton作为轻量级C语言按键处理库,采用硬件抽象层设计实现驱动解耦,支持单击、双击、长按等丰富事件类型。该方案通过集中式扫描策略和内置消抖算法,在RT-Thread和裸机环境中均能稳定运行,特别适合需要组合按键检测和低功耗优化的物联网设备。典型应用场景包括智能家居控制面板和工业HMI界面开发,其中硬件解耦架构和事件驱动模型显著提升代码复用率。

weixin_35757191的博客 402

HDU 4917 Permutation

题意: 一个序列p1、p2、p3……pn是由1、2、3……n这些数字组成的  现给出一些条件pi 思路: 很容易想到用一条有向的线连接所有的pi和pj  那么就构成了有向无环图(题中说有解所以无环) 又因为pi各不相同  那么题目就变成了有向无环图的拓扑排序的种类数 题目中边数较少  所以可能出现不连通情况  我们先讨论一个连通集合内拓扑排序的种类数 题目中m较小  可以利用状

House 1584

4.7W防削顶单声道D类音频功率放大器HT6872介绍

HT6872是一款低EMI,防削顶失真,单声道免滤波D类音频功率放大器。在6.5V电源,10%THD+N,4Ω负载条件下,输出4.71W功率,在各类音频终端应用中维持高效率并提供AB类放大器的性能。

weichen_78的博客 4697

2014多校5(1007)hdu4917(状态压缩dp+拓扑排序)

Permutation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 316    Accepted Submission(s): 88 Problem Description bobo has a perm

cq_phqg 1306

YOLOv8改进,YOLOv8添加可变性卷积DCNv2

DCNv2对原始的DCNv1进行了改进,可变形卷积网络的卓越性能源于其适应对象几何变化的能力。通过对其自适应行为的检查,虽然对其神经特征的空间支持比常规的ConvNets更接近于对象结构,但这种支持可能远远超出感兴趣区域,导致特征受到不相关图像内容的影响。为了解决这个问题,我们提出了一种可变形卷积网的重新表述,通过提高建模能力和更强的训练,提高了其专注于相关图像区域的能力。通过更全面地集成网络中的可变形卷积,并引入扩展变形建模范围的调制机制,增强了建模能力。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 3606

【YOLOv13[基础]】热力图可视化实践 | 脚本升级 | 优化可视化效果 | 论文必备 | GradCAMPlusPlus, GradCAM, XGradCAM, EigenCAM等

本文将进行添加YOLOv13版本的升级版热力图可视化功能的实践,支持图像热力图可视化、优化可视化效果、 可以选择使用GradCAMPlusPlus, GradCAM, XGradCAM, EigenCAM, HiResCAM, LayerCAM, RandomCAM, EigenGradCAM。一个参数即可设置是否显示检测框等。

静谧、淡雅 644

HDU4917 Permutation(状态压缩dp,图论)

Permutation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 896    Accepted Submission(s): 281 Problem Description bobo has a per

say_c_box的博客 716

【异常】CNB提示The bill authorization scope cannot access the current request.

摘要:CNB API返回403错误,表明当前token的授权范围无法访问目标仓库。主要原因是:1) REPO_SLUG填写错误,导致资源地址不匹配;2) CNB_TOKEN未授权目标仓库;3) 账号账单状态异常。解决步骤:先检查REPO_SLUG是否与CNB平台仓库地址完全一致;再确认CNB_TOKEN是否绑定目标仓库且有读取权限;最后检查账号账单是否正常且覆盖目标资源。完成排查后更新配置即可解决此授权问题。

奶爸的编程之路,也就一周冷个三天 663

HDU 4917 Permutation 拓扑排序的计数

题意:   一个有n个数的排列,给你一些位置上数字的大小关系。求合法的排列有多少种。 思路:   数字的大小关系可以看做是一条有向边,这样以每个位置当点,就可以把整个排列当做一张有向图。而且题目保证有解,所以只一张有向无环图。这样子,我们就可以把排列计数的问题转化为一个图的拓扑排序计数问题。   拓扑排序的做法可以参见ZJU1346 。   因为题目中点的数量比较多,所以无法直...

739

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

hdu 4917Permutation(状态压缩DP)

hdu 4917Permutation(状态压缩DP) 题意:将1~n的n个数排列成序列(n 解法:我们首先可以明确一点,这m个限制条件,所表示的关系会构成若干个DAG(有向无环图,我将其称之为拓扑图)。我们只要将这n个数,填入到拓扑图上,使其满足拓扑关系,那么这样的序列就是可以的。而这若干个拓扑图之间,是不会相互影响的,因而我们可以单独考虑每一个拓扑图。对于单独的一个拓扑图,

No__stop 1424

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

hdu 4917 拓扑排序计数

状态压缩dp求解拓扑排序的计数问题。 由于40个点,不能yi'qi

Cugb->Baoge 1935

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

hdu 4657 Find Permutation(高效)

题目链接:hdu 4657 Find Permutation代码#include <cstdio> #include <cstring> #include <algorithm>using namespace std; const int maxn = 1e5 + 5;int N, A[maxn], B[maxn], C[maxn], P[maxn];int main () { int ca

不慌不忙、不急不躁 1403

Tree and Permutation HDU - 6446(树形dp)

Tree and Permutation HDU - 6446 There are N vertices connected by N−1 edges, each edge has its own length. The set { 1,2,3,…,N } contains a total of N! unique permutations, let’s say the i-th permut...

codeswarrior的博客 427

hdu4917 A simple brute force problem.(最大权闭合)

n个项目,m个技术,每个项目可以赚取x[i]元,每个技术需要花费y[i]元,完成每个项目有一定的技术要求,也就是说某些技术必须先完成才能去完成这个项目,而且技术相互之间也有要求的,某些技术必须先完成才能去完成其他的技术。 显然的一点是可以看出来是最大权闭合问题,但是文中说的i必须先去j完成该怎么见图呢,开始我也建错了,样例都过不了,后来才仔细画了个图。 n=1,m=2; x[1] = 10,

KIJamesQi的博客 830

HDU 4472 Count

Count Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 36    Accepted Submission(s): 18 Problem Description Prof. Tigris is the head o

hqu_fritz的专栏 617

【题解】有限制的排列 [51nod1296]

【题解】有限制的排列 [51nod1296] 传送门:有限制的排列 \([51nod1296]\) 【题目描述】 给出 \(n,m_1,m_2\) 和 \(\{a[1],a[2]...a[m_1]\},\{b[1],b[2]...b[m_2]\}\) 计算整数 \([1,n]\) 满足以下条件的排列个数: 位置 \(a[i]\) \((i \in [1,m_1])\) 上的数均小于其邻居...

aiauw80822的博客 315

hdu 6235 Permutation

Permutation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 179    Accepted Submission(s): 132 Special Judge Problem Description A

Timeclimber 939

HDU 5789 Permutation

给定一棵大小为n的有根树,点的标号为1,...,n。现在要把树转化成一个序列,要求一个点的后代在序列中先出现,求所有满足条件的序列的逆序对数之和。

ShinFeb's Archieve 1911

拓扑排序方案数的求法

【描述】 给定一个有向图,求拓扑排序生成的序列数 【分析】 我们知道当所有儿子节点排好序的时候,父节点就排好序了。 这里我们定义一种状态:状态s的二进制位上的1表示此点已经排好序了。 例如:s=6时,化为二进制s=110,表示第2、3个点已经排好序了。 所以父节点的状态可以由子节点转移而来。 用son[i]表示节点i可以进行转移的合法状态,f[s]表示状态为s的方法...

anzhi7214的博客 1475
上一篇: Blocked websites CodeChef - WSITES01
下一篇: Vjudge Contest0 @2018-08-04
「已注销」
博客等级 码龄9年 13粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值