非降路径和Lindström–Gessel–Viennot定理(例题 牛客网暑期ACM多校训练营(第一场)A.Monotonic Matrix)(codeforces 348D HDU 5852)

参考博客and图片来源

https://blog.csdn.net/ftx456789/article/details/81132126

非降路径

就是给定一个起点(0,0)和终点(m,n),然后只能向右或者向上走。

非降路径问题转换为组合数可以认为总共有n+m种选择,从中选出m步向右走,或者选择n步向上走,则可得路径的方案数为C_{n+m}^{n}C_{n+m}^{m}

Lindström–Gessel–Viennot定理

详见维基百科:https://en.wikipedia.org/wiki/Lindstr%C3%B6m%E2%80%93Gessel%E2%80%93Viennot_lemma

这里只了解应用即可

对于一张无边权的DAG图,给定n个起点和对应的n个终点,这n条不相交路径的方案数为

非降路径和Lindström–Gessel–Viennot定理(例题 牛客网暑期ACM多校训练营(第一场)A.Monotonic Matrix)(codeforces 348D HDU 5852)_第1张图片

其中 ai 代表路径的起点 bi 代表路径的终点 e(ai,bj) 代表ai到bj的方案数。

例题一(牛客网暑期ACM多校训练营(第一场)A.Monotonic Matrix)

题目链接:https://www.nowcoder.com/acm/contest/139/A

题目描述 
Count the number of n x m matrices A satisfying the following condition modulo (109+7). 
* Ai, j ∈ {0, 1, 2} for all 1 ≤ i ≤ n, 1 ≤ j ≤ m. 
* Ai, j ≤ Ai + 1, j for all 1 ≤ i < n, 1 ≤ j ≤ m. 
* Ai, j ≤ Ai, j + 1 for all 1 ≤ i ≤ n, 1 ≤ j < m. 
输入描述: 
The input consists of several test cases and is terminated by end-of-file. 
Each test case contains two integers n and m. 
输出描述: 
For each test case, print an integer which denotes the result. 
示例1 
输入
1 2 
2 2 
1000 1000 
输出

20 
540949876 
备注: 
* 1 ≤ n, m ≤ 103 
* The number of test cases does not exceed 105.

题目大意:

给你一个nxm的矩阵,可以向其中填 0 , 1 , 2 三个数中的任意一个且满足 Ai,j⩽Ai+1,j ,Ai,j⩽Ai,j+1 ,问一共有多少种方案。

思路:

由题意知 0,1,2 把整个矩阵分成了3部分,如下图,那么填充矩阵的方案数就等于这两条可以重合(不可相交)的分界线的种类数

è¿éåå¾çæè¿°

我们可以吧分界线看为路径,如果是有两个起点,两个终点的不想交路径,我们就可以用上面得Lindström–Gessel–Viennot定理来做(每一对起点终点的路径数都可由非降路径的组合数公式得到)。那么,我们就可以其中的一条分界线向左上平移使其变为(n−1,−1)−>(−1,m−1),如下图,这样我们就可以用定理计算辣。

è¿éåå¾çæè¿°

运用定理得

非降路径和Lindström–Gessel–Viennot定理(例题 牛客网暑期ACM多校训练营(第一场)A.Monotonic Matrix)(codeforces 348D HDU 5852)_第2张图片

那么,这一个问题就解决了。

代码如下:

#include 
#include 
#include 

using namespace std;

const int MAXN=2e3+5;
const long long MOD=1e9+7;
long long C[MAXN][MAXN];

void Init()//递推求组合数
{
    C[0][0] = 1;
    for(int i=1;i

例题二,三

codeforces 348D  HDU 5852

题解略~~

你可能感兴趣的:(学习随笔)