LGV应用 codeforces348 + 牛客暑假多校训练营 Monotonic Matrix
Lindström–Gessel–Viennot lemma,即 LGV 引理,可以用来处理有向无环图(DAG)上不相交路径计数等问题。
具体证明可以参考维基百科
所以问题就转化为求A集合中的点到B集合中点的方案数,然后填入上边的行列式,可以利用高斯消元求解。
当然一个点到另一个点路线的方案数可以利用DP做时间复杂度O(nm)O(nm)O(nm),也可以直接用组合数的方式求出来。
codeforces 348
题目描述
从 (0,0)(0, 0)(0,0) 点到 (n,m)(n, m)(n,m) 点两条不相交路线的方案数,障碍物不能通过。
思路
因为是从 (0,0)(0, 0)(0,0) 到 (n,m)(n, m)(n,m) 的路线,所以我们可以将题目转化为从 s1(1,2)s1 (1, 2)s1(1,2) 和 s2(2,1)s2 (2, 1)s2(2,1) 两个点到 e1(n−1,m)e1 (n - 1, m)e1(n−1,m) 和 e2(n,m−1)e2 (n, m - 1)e2(n,m−1) 两个点的路线总数,所以我们可以单独求出s1到e1、e2的方案数和s2到e1、e2的方案数,然后就可以带入LGV公式求出行列式的值就可以了。
#include <bits/stdc++.h>using namespace std;const int N = 3010;
const int mod = 1e9 + 7;char g[N][N];
int dp[N][N];
int n, m;int main() {cin >> n >> m;for (int i = 1; i <= n; i++) scanf("%s", g[i] + 1);if (g[1][2] != '#') dp[1][2] = 1;for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {if (g[i][j] != '#') {dp[i][j] = ((dp[i][j] + dp[i - 1][j]) % mod + dp[i][j - 1]) % mod;}}}long long ans1 = dp[n - 1][m], ans2 = dp[n][m - 1]; //ans1 = s1 -> e1 ans2 = s1 -> e2memset(dp, 0, sizeof(dp));if (g[2][1] != '#') dp[2][1] = 1;for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {if (g[i][j] != '#') {dp[i][j] = ((dp[i][j] + dp[i - 1][j]) % mod + dp[i][j - 1]) % mod;}}}long long ans3 = dp[n - 1][m], ans4 = dp[n][m - 1];// ans3 = s2 -> e1 ans4 = s2 -> e2int res = ((ans1 * ans4) % mod - (ans2 * ans3) % mod + mod) % mod;// 因为这个是两行两列的行列式,所以直接交叉相乘然后相减就可以// 如果是多行多列的就需要利用高斯消元求解cout << res << endl;return 0;
}
Monotonic Matrix
题目描述
使用 0,1,20, 1, 20,1,2 这三个数将 n,m(1<=n,m<=1000)n, m(1 <= n, m <= 1000)n,m(1<=n,m<=1000) 矩阵填充满,需要满足从左上角到右下角非递减
思路
通过题意我们不难发现0, 1, 2这三个数是分为三个部分0一定位于左上角1位于中间的部分而2位于右下角,所以这样就可以划分出0, 1分界线和1, 2分界线,分界线就是从右上角到左下角的。
于是题目就可以转化为从右上角到左下角两条路线的方案数,但是我们这两条路线是可以重合的,而LGV是不相交的路径。所以我们可以把0,1分界线向左上平移或者是把1,2分界线向右下平移。
这样就可以转化成为求两条不相交路径的方案数,这里求路线的方案数可以直接使用组合数进行
∣(n+m,n)(n+m,n+1)(n+m,n−1)(n+m,n)∣\left| \begin{array}{cccc} (n + m, n) & (n + m, n + 1)\\ (n + m, n - 1) & (n + m, n) \end{array} \right| ∣∣∣∣(n+m,n)(n+m,n−1)(n+m,n+1)(n+m,n)∣∣∣∣
(n+m,n)(n + m, n)(n+m,n) 表示的 (s1−>e1)(s1 -> e1)(s1−>e1) 总步数是n + m步,然后选取n步向下走
(n+m,n+1)(n + m, n + 1)(n+m,n+1) 表示的 (s1−>e2)(s1 -> e2)(s1−>e2) 总步数是n + m步,然后选取n + 1步向下走
其余两个同理
#include <bits/stdc++.h>using namespace std;const int N = 2010;
const int mod = 1e9 + 7;int c[N][N];
int n, m;int main() {for (int i = 0; i < N; i++) {for (int j = 0; j <= i; j++) {if (!j) c[i][j] = 1;else c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % mod;}}while (cin >> n >> m) {int ans1 = c[n + m][n], ans2 = c[n + m][n + 1];// 起点总是右上角// ans1 表示从蓝色起点到蓝色终点// ans2 表示从蓝色起点到红色终点int ans3 = c[n + m][n - 1], ans4 = c[n + m][n];// ans3 表示红色起点到蓝色终点// ans4 表示红色起点到红色终点cout << (((long long)ans1 * ans4) % mod - ((long long)ans2 * ans3) % mod + mod) % mod << endl;}return 0;
}
LGV应用 codeforces348 + 牛客暑假多校训练营 Monotonic Matrix相关推荐
- 2021牛客暑假多校第二场 K题—Stack (链表)
2021牛客暑假多校第二场 K题-Stack 题意: 一个单调栈,给你第n次操作时里面数据的数量,让你给出里面塞入的会是哪些数字. 主要思想:链表模拟 (代码里面有注释) (题解一开始说的是拓扑,后来 ...
- 2021牛客暑期多校训练营9 Cells(LGV引理,FFT)
2021牛客暑期多校训练营9 Cells(LGV引理,FFT) 题目链接 题意 在一个无限大的xyxyxy坐标轴上,求从A={(0,a1),(0,a2),...,(0,an)}A=\{(0,a_1) ...
- 2021牛客暑假多校第八场 K题—Yet Another Problem About Pi
2021牛客暑假多校第八场 K题-Yet Another Problem About Pi 题意:告诉你一个单元格的长和宽,问你走Π(3.1415926-)的长度距离最多可以走几个单元格 思路:沿着单 ...
- 2019牛客暑假多校7E:Find the median【线段树上二分】
题目: 2019牛客暑期多校训练营第七场E:Find the median 题意: 给出N个操作,每次操作向数组中插入[L,R]的数字,每次操作后询问数组中的中位数 分析: 如果L,R都比较小,就可以 ...
- 2019牛客暑期多校训练营(第五场)C generator 2 (BSGS)
2019牛客暑期多校训练营(第五场)C generator 2 思路 x0=x0x_0 = x_0x0=x0 x1=a∗x0∗bx_1 = a * x_0 * bx1=a∗x0∗b x2=a∗ ...
- 2021牛客暑期多校训练营9
2021牛客暑期多校训练营9 题号 题目 知识点 A A Math Challenge B Best Subgraph C Cells D Divide-and-conquer on Tree E E ...
- 2021牛客暑期多校训练营5
2021牛客暑期多校训练营5 题号 题目 知识点 A Away from College B Boxes 概率 C Cheating and Stealing D Double Strings 线性d ...
- 2021牛客暑期多校训练营4
2021牛客暑期多校训练营4 题号 题目 知识点 A Course B Sample Game C LCS D Rebuild Tree E Tree Xor 思维+线段树 F Just a joke ...
- 2021牛客暑期多校训练营3
2021牛客暑期多校训练营3 题号 题目 知识点 A Guess and lies B Black and white C Minimum grid 二分图匹配 D Count E Math 数论+打 ...
最新文章
- 图像识别落地机会最多 腾讯全面输出视觉AI
- 27 多进程之进程池Pool
- 【集合论】容斥原理 ( 复杂示例 )
- KaleidoscopeGame
- python中的insert函数_Python numpy.insert函数方法的使用
- 06 | 案例篇:系统的 CPU 使用率很高,但为啥却找不到高 CPU 的应用?
- 【转】Oracle执行计划解释
- 支持海量数据的 MongoDB NoSQL
- java实现遍历树形菜单方法——OpenSessionView实现
- HTTP1.1/2.0与QUIC协议
- 蓝桥训练之前缀和与差分
- android imagebutton 点击效果缩小,imagebutton 设置点击和按压效果
- JS 字符串分割以及填充
- Linux修改/设置服务器ip地址
- 基于HTML+CSS+JavaScript制作服装商城网站设计毕业论文源码
- 企业微信公众平台(4)KTV 3G网站建设
- 9.NBA球员数据分析
- matlab中idfs,【 MATLAB 】离散傅里叶变换(DFT)以及逆变换(IDFT)的MATLAB实现
- 2022 年超详细过程步骤讲解 CentOS 7 安装Maven。以及Mavne配置文件的修改
- 服务注册Service Registration