题目传送门

通过看题解画图可以发现:

不论怎么转,一列里的横边/一行里的竖边始终平行

当我们加固一个格子时,会让它所在的这一行的竖边和这一列的横边保证垂直

而我们的目标是求所有竖边和横边都保证垂直的方案数

把一行里的所有竖边看成一个点,把一列里的所有横边看成一个点。一共$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 (联通块计数问题)相关推荐

  1. HDU 5729 Rigid Frameworks(连通性DP)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5729 [题目大意] 给出一个n*m的方格框,可以在单位矩形中添加两种对角线的线,使得其变得稳定,问 ...

  2. R6饮料AK赛(NOIP模拟赛)/省选专练HDU 5713 K个联通块

    我好菜啊100+60+30 滚犊子吧,两天加起来才410搞个屁我一年前都可以考400 不说了,题毕竟比较难 T1还是水题但是比昨天难 这是一个开绝对值不等式的题. 根据对奇数和偶数的最优根的归纳一定有 ...

  3. HDU - 5925 Coconuts (二维离散化+求联通块)

    原题地址:http://acm.hdu.edu.cn/showproblem.php?pid=5925 题意:求连通块的个数,以及每个联通块中点的个数. 数据范围:1e9 思路:离散化之后,dfs求联 ...

  4. HDU 2952 Counting Sheep (DFS找联通块)

    题目链接:请戳这里.   题目大意及思路:读懂题意就好了,就是DFS找联通块. 没什么好说的,见代码吧. #include<cstdio> #include<cstring> ...

  5. P1236-Network of Schools(学校网络)【最强联通块,Kosaraju】

    正题 POJ题目链接 给出一个图,求联通块数量和加入多少条边后会将全图变为一个最强联通块. 机翻输入输出(需要自取) 输入 第一行包含整数N:网络中的学校数量(2 <= N <= 100) ...

  6. F 魏迟燕的自走棋(思维+贪心+并查集维护联通块/左部点配对边<=2的匈牙利)

    https://ac.nowcoder.com/acm/contest/9984/F 参考:F 魏迟燕的自走棋(贪心+并查集) 将每个人看成一个点,武器的能力值抽象成边,这样就转化成图论的模型了. 然 ...

  7. 联通块 【题目描述】 一个n * m的方格图,一些格子被涂成了黑色,在方格图中被标为1,白色格子标为0。问有多少个四连通的黑色格子连通块。四连通的黑色格子连通块指的是一片由黑色格子组成的区域,其中的每

    联通块 [题目描述] 一个n * m的方格图,一些格子被涂成了黑色,在方格图中被标为1,白色格子标为0.问有多少个四连通的黑色格子连通块.四连通的黑色格子连通块指的是一片由黑色格子组成的区域,其中的每 ...

  8. 模拟战役题解(dfs,联通块,贪心)

    目录 题目描述 输入描述: 输出描述: 输入 输出 输入 输出 思路: 代码: 题目描述 齐齐和司机在玩单机游戏<红色警戒IV>,现在他们的游戏地图被划分成一个n*m的方格地图.齐齐的基地 ...

  9. 区间动态规划考试反思总结——颜色联通块 分离与合体 括号涂色

    引子: 额~今天我们昨天才学了区间DP, 还没来得及复习就迎来了老师最喜欢的--我们最喜欢的模拟考试.但是,好像题已经超乎了我的想象. 啊啊啊啊啊啊啊啊啊!!! 后面两道没怎么读懂题啊! First ...

最新文章

  1. Python入门之编程与编程语言
  2. WPF#39;s Style BasedOn
  3. flavor android build,android BuildType和BuildFlavor
  4. 多个DataSet数据合并
  5. Hadoop 2.2.0源码浏览:4. NodeManager
  6. Java Web笔记之Struts2.1 +Hibernate3.3 +Spring3.0
  7. 第41章 实施数据库审计
  8. 【redis 学习系列08】Redis小功能大用处02 Pipeline、事务与Lua
  9. 利用HP优盘启动盘格式化工具制作U盘Dos启动盘
  10. 如何在虚拟机中安装操作系统???
  11. html给表格添加标题栏,word表格怎么添加标题栏 如何在word表格上方加标题
  12. 2GB显存畅玩 DeepFaceLab更新至2019.12.29
  13. python中求差的函数_Python编程基础11:函数和模块
  14. 【知识点】信道路径衰落分类、计算公式、换算
  15. netty系列之:请netty再爱UDT一次
  16. PBX220评测报告
  17. 数仓服务平台在唯品会的建设实践
  18. surface pro 7键盘只能识别功能区,无法输入字母和数字
  19. 年度考核如何实现排名?
  20. amd6800h安装ubuntu22.04 笔记本休眠花屏解决办法

热门文章

  1. 华为s2600t java_华为服务器RH2288H V2连接 华为存储S2600T
  2. Python入门--个数可变的位置参数和关键字参数
  3. objective-c和java哪个简单_Objective-C和Java的简单对比
  4. eplices如何导入外部代码_搜索引擎的蜘蛛是如何爬的
  5. python中去除异常值_在Python中获取异常值
  6. 计算机网络—PPP协议和HDLC协议
  7. p71_文件传送协议FTP
  8. [leetcode] 95. 不同的二叉搜索树 II
  9. 链路状态路由选择LS
  10. [再学Python] - 2 - math库和random库