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) 矩阵填充满,需要满足从左上角到右下角非递减

思路

  1. 通过题意我们不难发现0, 1, 2这三个数是分为三个部分0一定位于左上角1位于中间的部分而2位于右下角,所以这样就可以划分出0, 1分界线1, 2分界线,分界线就是从右上角到左下角的。

  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相关推荐

  1. 2021牛客暑假多校第二场 K题—Stack (链表)

    2021牛客暑假多校第二场 K题-Stack 题意: 一个单调栈,给你第n次操作时里面数据的数量,让你给出里面塞入的会是哪些数字. 主要思想:链表模拟 (代码里面有注释) (题解一开始说的是拓扑,后来 ...

  2. 2021牛客暑期多校训练营9 Cells(LGV引理,FFT)

    2021牛客暑期多校训练营9 Cells(LGV引理,FFT) 题目链接 题意 在一个无限大的xyxyxy​坐标轴上,求从A={(0,a1),(0,a2),...,(0,an)}A=\{(0,a_1) ...

  3. 2021牛客暑假多校第八场 K题—Yet Another Problem About Pi

    2021牛客暑假多校第八场 K题-Yet Another Problem About Pi 题意:告诉你一个单元格的长和宽,问你走Π(3.1415926-)的长度距离最多可以走几个单元格 思路:沿着单 ...

  4. 2019牛客暑假多校7E:Find the median【线段树上二分】

    题目: 2019牛客暑期多校训练营第七场E:Find the median 题意: 给出N个操作,每次操作向数组中插入[L,R]的数字,每次操作后询问数组中的中位数 分析: 如果L,R都比较小,就可以 ...

  5. 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∗ ...

  6. 2021牛客暑期多校训练营9

    2021牛客暑期多校训练营9 题号 题目 知识点 A A Math Challenge B Best Subgraph C Cells D Divide-and-conquer on Tree E E ...

  7. 2021牛客暑期多校训练营5

    2021牛客暑期多校训练营5 题号 题目 知识点 A Away from College B Boxes 概率 C Cheating and Stealing D Double Strings 线性d ...

  8. 2021牛客暑期多校训练营4

    2021牛客暑期多校训练营4 题号 题目 知识点 A Course B Sample Game C LCS D Rebuild Tree E Tree Xor 思维+线段树 F Just a joke ...

  9. 2021牛客暑期多校训练营3

    2021牛客暑期多校训练营3 题号 题目 知识点 A Guess and lies B Black and white C Minimum grid 二分图匹配 D Count E Math 数论+打 ...

最新文章

  1. 图像识别落地机会最多 腾讯全面输出视觉AI
  2. 27 多进程之进程池Pool
  3. 【集合论】容斥原理 ( 复杂示例 )
  4. KaleidoscopeGame
  5. python中的insert函数_Python numpy.insert函数方法的使用
  6. 06 | 案例篇:系统的 CPU 使用率很高,但为啥却找不到高 CPU 的应用?
  7. 【转】Oracle执行计划解释
  8. 支持海量数据的 MongoDB NoSQL
  9. java实现遍历树形菜单方法——OpenSessionView实现
  10. HTTP1.1/2.0与QUIC协议
  11. 蓝桥训练之前缀和与差分
  12. android imagebutton 点击效果缩小,imagebutton 设置点击和按压效果
  13. JS 字符串分割以及填充
  14. Linux修改/设置服务器ip地址
  15. 基于HTML+CSS+JavaScript制作服装商城网站设计毕业论文源码
  16. 企业微信公众平台(4)KTV 3G网站建设
  17. 9.NBA球员数据分析
  18. matlab中idfs,【 MATLAB 】离散傅里叶变换(DFT)以及逆变换(IDFT)的MATLAB实现
  19. 2022 年超详细过程步骤讲解 CentOS 7 安装Maven。以及Mavne配置文件的修改
  20. 服务注册Service Registration

热门文章

  1. MacOSX 自动恢复功能
  2. Android 设置Wifi热点、打开与关闭的监听
  3. SAP 中国的咨询合作伙伴
  4. iOS 收集的高仿项目
  5. android手机和电脑通过wifit通信
  6. MOS管规格书参数解析
  7. hdu-2547无剑无我
  8. sql---distinct函数用法
  9. 秋招准备-基础知识篇(正更)
  10. Attribute(特性)