题目链接


\(Description\)

给定\(n*m\)的网格,有些格子不能走。求有多少种从\((1,1)\)走到\((n,m)\)的两条不相交路径。

\(n,m\leq 3000\)。

\(Solution\)

容斥,用总方案数减去路径一定相交的方案数。

怎么算呢?注意到两条相交的路径(一定)可以看做从\((1,2)\)到\((n,m-1)\)和从\((2,1)\)到\((n-1,m)\)的两条路径。总方案数也可以看做从\((1,2)\)到\((n-1,m)\)和从\((2,1)\)到\((n,m-1)\)的两条路径(如果有相交可以对称过去得到这样的两条路径)。

所以\((1,2)\)到\((n-1,m)\)的方案数,乘上\((2,1)\)到\((n,m-1)\)的方案数,减去,\((1,2)\)到\((n-1,m)\)的方案数,乘上\((2,1)\)到\((n-1,m)\)的方案数,就是答案了。

其实我也还是感觉有点迷...

其实有一个引理:Lindström–Gessel–Viennot lemma

下面就粘attack的了。

这个定理是说点集\(A=\{a1,a2,…an\}\)到\(B=\{b1,b2,...,bn\}\)的不相交路径条数等于行列式$$\begin{bmatrix}e(a_1, b_1) & e(a_1, b_2) & \dots & e(a_1, b_n) \

e(a_2, b_1) & e(a_2, b_2) & \dots & e(a_2, b_n) \

\vdots & \vdots & \ddots & \vdots \

e(a_n, b_1) & e(a_n, b_2) & \dots & e(a_n, b_n) \

\end{bmatrix}$$的值。其中\(e(x,y)\)表示从\(x\)到\(y\)的路径条数

定理的本质还是容斥。

本题,我们需要找到两条不相交的路径。注意到任何一对合法的路径一定可以表示为,一条从\((1,2)\)出发到\((n−1,m)\),另一条从\((2,1)\)出发到\((n,m−1)\)。

那么选取\(A=\{(1,2)\ (2,1)\},B=\{(n−1,m)\ (n,m−1)\}\),带入到上述定理即可求解。

事实上只用一遍DP就可以了(两个DP数组,分别表示从\((1,2)\)和\((2,1)\)出发,for到\((n,m)\)就可以了)。。

也可以加fread,懒得改了。


//498ms	44000KB
#include <cstdio>
#include <cstring>
#include <algorithm>
#define mod 1000000007
#define Mod(x) x>=mod&&(x-=mod)
const int N=3005; bool mp[N][N]; int Calc(int sx,int sy,int tx,int ty)
{
static int f[N][N];
memset(f,0,sizeof f);
f[sx-1][sy]=1;//Init: f[sx][sy]=mp[sx][sy]==1;
for(int i=sx; i<=tx; ++i)
for(int j=sy; j<=ty; ++j)
mp[i][j]?(f[i][j]=f[i-1][j]+f[i][j-1],Mod(f[i][j])):0;
return f[tx][ty];
} int main()
{
int n,m; scanf("%d%d",&n,&m);
char s[N];
for(int i=1; i<=n; ++i)
{
scanf("%s",s+1);
for(int j=1; j<=m; ++j) mp[i][j]=s[j]=='.';
}
printf("%I64d\n",(1ll*Calc(1,2,n-1,m)*Calc(2,1,n,m-1)%mod+mod-1ll*Calc(1,2,n,m-1)*Calc(2,1,n-1,m)%mod)%mod); return 0;
}

Codeforces.348D.Turtles(容斥 LGV定理 DP)的更多相关文章

  1. codeforces 348D Turtles

    codeforces 348D Turtles 题意 题解 代码 #include<bits/stdc++.h> using namespace std; #define fi first ...

  2. 【UOJ#422】【集训队作业2018】小Z的礼物(min-max容斥,轮廓线dp)

    [UOJ#422][集训队作业2018]小Z的礼物(min-max容斥,轮廓线dp) 题面 UOJ 题解 毒瘤xzy,怎么能搬这种题当做WC模拟题QwQ 一开始开错题了,根本就不会做. 后来发现是每次 ...

  3. [Hdu-5155] Harry And Magic Box[思维题+容斥,计数Dp]

    Online Judge:Hdu5155 Label:思维题+容斥,计数Dp 题面: 题目描述 给定一个大小为\(N*M\)的神奇盒子,里面每行每列都至少有一个钻石,问可行的排列方案数.由于答案较大, ...

  4. CodeForces 348D Turtles(LGV定理)题解

    题意:两只乌龟从1 1走到n m,只能走没有'#'的位置,问你两只乌龟走的时候不见面的路径走法有几种 思路:LGV定理模板.但是定理中只能从n个不同起点走向n个不同终点,那么需要转化.显然必有一只从1 ...

  5. bzoj 3782 上学路线 卢卡斯定理 容斥 中国剩余定理 dp

    LINK:上学路线 从(0,0)走到(n,m)每次只能向上或者向右走 有K个点不能走求方案数,对P取模. \(1\leq N,M\leq 10^10 0\leq T\leq 200\) p=10000 ...

  6. cf348D. Turtles(LGV定理 dp)

    题意 题目链接 在\(n \times m\)有坏点的矩形中找出两条从起点到终点的不相交路径的方案数 Sol Lindström–Gessel–Viennot lemma的裸题? 这个定理是说点集\( ...

  7. bzoj2669[cqoi2012]局部极小值 容斥+状压dp

    2669: [cqoi2012]局部极小值 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 774  Solved: 411[Submit][Status ...

  8. LOJ3053 十二省联考2019 希望 容斥、树形DP、长链剖分

    传送门 官方题解其实讲的挺清楚了,就是锅有点多-- 一些有启发性的部分分 L=N 一个经典(反正我是不会)的容斥:最后的答案=对于每个点能够以它作为集合点的方案数-对于每条边能够以其两个端点作为集合点 ...

  9. 【BZOJ】4767: 两双手【组合数学】【容斥】【DP】

    4767: 两双手 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1057  Solved: 318[Submit][Status][Discuss] ...

随机推荐

  1. 小学生都看得懂的C语言入门(5): 指针

    现在已经学到C语言的后面了, 快学完咯.... (一)取地址运算 先来看一下sizeof 计算所占字节 #include<stdio.h> int main() { int a; a=; ...

  2. zoj3659

    #include<iostream> #include<algorithm> #include<cstring> #define ll long long #inc ...

  3. shell 脚本加密

    日常编写shell脚本时会写一些账号和密码写入脚本内,但是不希望泄露账号密码,所以对shell脚本进行加密变成可执行文件. 主要使用 shc 对 Linux shell 脚本加密,shc是一个专业的加 ...

  4. scss文件使用笔记

    1.编写兼容性代码 例如透明度,兼容IE @mixin mOpacity($o){ opacity:$o/100; filter:alpha(opacity=$o); } //引用 .box{ @in ...

  5. Django认证系统auth认证

    使用Django认证系统auth认证 auth认证系统可以处理范围非常广泛的任务,且具有一套细致的密码和权限实现.对于需要与默认配置不同需求的项目,Django支持扩展和自定义认证;会将用户信息写入到 ...

  6. java使用Jsch实现远程操作linux服务器进行文件上传、下载,删除和显示目录信息

    1.java使用Jsch实现远程操作linux服务器进行文件上传.下载,删除和显示目录信息. 参考链接:https://www.cnblogs.com/longyg/archive/2012/06/2 ...

  7. DBEntityEntry类

    DBEntityEntry是一个重要的类,可用于检索有关实体的各种信息.您可以使用DBContext的Entry方法获取特定实体的DBEntityEntry实例. DBEntityEntry允许您访问 ...

  8. Python_二维数组

    例1:将数组旋转90度 a = [[i for i in range(4)] for n in range(4)] print(a) # 遍历大序列 for a_index, w in enumera ...

  9. Python_部分内置函数

    内置函数:可以直接调用的函数 all():传入的列表,元组,等等,只要一个为假,就为假(fales)(所有的都为真才为真) # None, {}:空字典, []:空列表, 0:零,():空集合,“”: ...

  10. fillder--信息面板展示serverIP

    1.Ctrl+R打开面板 2.如上图的位置,加上一句后,重启Fillder即可 FiddlerObject.UI.lvSessions.AddBoundColumn(, "X-HostIP& ...