HDU 5729 Rigid Frameworks (联通块计数问题)
题目传送门
通过看题解画图可以发现:
不论怎么转,一列里的横边/一行里的竖边始终平行
当我们加固一个格子时,会让它所在的这一行的竖边和这一列的横边保证垂直
而我们的目标是求所有竖边和横边都保证垂直的方案数
把一行里的所有竖边看成一个点,把一列里的所有横边看成一个点。一共$n+m$个点
把图看成二分图,左侧$n$个点,右侧$m$个点。加固一个格子相当于在左侧的一个点和右侧的一个点之间连边!
我们的问题变成了求解二分图的连通图个数!
接下来就是很套路的$DP$了
定义$f(a,b)$表示左边$a$个点,右边$b$个点的连通二分图个数
对于连通图问题,我们依然采用常规的“固定思想”,我们固定左侧第一个点
直接求联通很困难,考虑用不合法的情况相减,可得$DP$方程:
$f(a,b)=3^{ab}-\sum_{i=0}^{a}\sum_{j=0}^{b}f(i,j)C_{a-1}^{i-1}C_{b}^{j}3^{(a-i)(b-j)}$
(注意i=a,j=b是不能转移的)
初值怎么赋需要思考
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #define N1 65 5 #define M1 3605 6 #define ll long long 7 using namespace std; 8 const ll p=1000000007; 9 10 int n,m,T; 11 int pw3[M1],C[N1][N1],f[N1][N1]; 12 13 int main() 14 { 15 int i,j,a,b; n=60; m=60; 16 for(i=1,pw3[0]=1;i<=n*m;i++) pw3[i]=3ll*pw3[i-1]%p; 17 C[0][0]=1; 18 for(i=1;i<=max(n,m);i++) 19 { 20 C[i][0]=C[i][i]=1; 21 for(j=1;j<i;j++) 22 C[i][j]=(C[i-1][j]+C[i-1][j-1])%p; 23 } 24 f[1][0]=1; f[1][1]=2; //pw3[0]=0; 25 for(a=1,b=2;b<=m;b++) 26 { 27 f[a][b]=pw3[a*b]; 28 for(j=0,i=1;j<b;j++) 29 { 30 f[a][b]=(f[a][b]-1ll*f[i][j]*C[a-1][i-1]%p*C[b][j]%p*pw3[(a-i)*(b-j)]%p+p)%p; 31 } 32 } 33 for(a=2;a<=n;a++) 34 { 35 for(b=1;b<=m;b++) 36 { 37 f[a][b]=pw3[a*b]; 38 for(i=1;i<a;i++) 39 for(j=0;j<=b;j++) 40 f[a][b]=(f[a][b]-1ll*f[i][j]*C[a-1][i-1]%p*C[b][j]%p*pw3[(a-i)*(b-j)]%p+p)%p; 41 for(j=0,i=a;j<b;j++) 42 f[a][b]=(f[a][b]-1ll*f[i][j]*C[a-1][i-1]%p*C[b][j]%p*pw3[(a-i)*(b-j)]%p+p)%p; 43 } 44 } 45 while(scanf("%d%d",&n,&m)!=EOF) 46 { 47 printf("%d\n",f[n][m]); 48 } 49 return 0; 50 }
转载于:https://www.cnblogs.com/guapisolo/p/10566844.html
HDU 5729 Rigid Frameworks (联通块计数问题)相关推荐
- HDU 5729 Rigid Frameworks(连通性DP)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5729 [题目大意] 给出一个n*m的方格框,可以在单位矩形中添加两种对角线的线,使得其变得稳定,问 ...
- R6饮料AK赛(NOIP模拟赛)/省选专练HDU 5713 K个联通块
我好菜啊100+60+30 滚犊子吧,两天加起来才410搞个屁我一年前都可以考400 不说了,题毕竟比较难 T1还是水题但是比昨天难 这是一个开绝对值不等式的题. 根据对奇数和偶数的最优根的归纳一定有 ...
- HDU - 5925 Coconuts (二维离散化+求联通块)
原题地址:http://acm.hdu.edu.cn/showproblem.php?pid=5925 题意:求连通块的个数,以及每个联通块中点的个数. 数据范围:1e9 思路:离散化之后,dfs求联 ...
- HDU 2952 Counting Sheep (DFS找联通块)
题目链接:请戳这里. 题目大意及思路:读懂题意就好了,就是DFS找联通块. 没什么好说的,见代码吧. #include<cstdio> #include<cstring> ...
- P1236-Network of Schools(学校网络)【最强联通块,Kosaraju】
正题 POJ题目链接 给出一个图,求联通块数量和加入多少条边后会将全图变为一个最强联通块. 机翻输入输出(需要自取) 输入 第一行包含整数N:网络中的学校数量(2 <= N <= 100) ...
- F 魏迟燕的自走棋(思维+贪心+并查集维护联通块/左部点配对边<=2的匈牙利)
https://ac.nowcoder.com/acm/contest/9984/F 参考:F 魏迟燕的自走棋(贪心+并查集) 将每个人看成一个点,武器的能力值抽象成边,这样就转化成图论的模型了. 然 ...
- 联通块 【题目描述】 一个n * m的方格图,一些格子被涂成了黑色,在方格图中被标为1,白色格子标为0。问有多少个四连通的黑色格子连通块。四连通的黑色格子连通块指的是一片由黑色格子组成的区域,其中的每
联通块 [题目描述] 一个n * m的方格图,一些格子被涂成了黑色,在方格图中被标为1,白色格子标为0.问有多少个四连通的黑色格子连通块.四连通的黑色格子连通块指的是一片由黑色格子组成的区域,其中的每 ...
- 模拟战役题解(dfs,联通块,贪心)
目录 题目描述 输入描述: 输出描述: 输入 输出 输入 输出 思路: 代码: 题目描述 齐齐和司机在玩单机游戏<红色警戒IV>,现在他们的游戏地图被划分成一个n*m的方格地图.齐齐的基地 ...
- 区间动态规划考试反思总结——颜色联通块 分离与合体 括号涂色
引子: 额~今天我们昨天才学了区间DP, 还没来得及复习就迎来了老师最喜欢的--我们最喜欢的模拟考试.但是,好像题已经超乎了我的想象. 啊啊啊啊啊啊啊啊啊!!! 后面两道没怎么读懂题啊! First ...
最新文章
- Python入门之编程与编程语言
- WPF#39;s Style BasedOn
- flavor android build,android BuildType和BuildFlavor
- 多个DataSet数据合并
- Hadoop 2.2.0源码浏览:4. NodeManager
- Java Web笔记之Struts2.1 +Hibernate3.3 +Spring3.0
- 第41章 实施数据库审计
- 【redis 学习系列08】Redis小功能大用处02 Pipeline、事务与Lua
- 利用HP优盘启动盘格式化工具制作U盘Dos启动盘
- 如何在虚拟机中安装操作系统???
- html给表格添加标题栏,word表格怎么添加标题栏 如何在word表格上方加标题
- 2GB显存畅玩 DeepFaceLab更新至2019.12.29
- python中求差的函数_Python编程基础11:函数和模块
- 【知识点】信道路径衰落分类、计算公式、换算
- netty系列之:请netty再爱UDT一次
- PBX220评测报告
- 数仓服务平台在唯品会的建设实践
- surface pro 7键盘只能识别功能区,无法输入字母和数字
- 年度考核如何实现排名?
- amd6800h安装ubuntu22.04 笔记本休眠花屏解决办法
热门文章
- 华为s2600t java_华为服务器RH2288H V2连接 华为存储S2600T
- Python入门--个数可变的位置参数和关键字参数
- objective-c和java哪个简单_Objective-C和Java的简单对比
- eplices如何导入外部代码_搜索引擎的蜘蛛是如何爬的
- python中去除异常值_在Python中获取异常值
- 计算机网络—PPP协议和HDLC协议
- p71_文件传送协议FTP
- [leetcode] 95. 不同的二叉搜索树 II
- 链路状态路由选择LS
- [再学Python] - 2 - math库和random库