题目链接


\(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. lightoj1214 大数取模模板

    #include<bits/stdc++.h> using namespace std; #define maxn 300 #define ll long long ll a,b; ]; ...

  2. 三 os模块

    os模块是与操作系统交互的一个接口 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname") 改变当前脚本工作目录:相 ...

  3. Windows10系统运行bat文件 一闪而过 解决

    1.在*.bat所在的文件夹按住shift 键然后鼠标右键,选择“在此处打开命令窗口”, 2.输入bat文件名称然后回车 这样就不会自动消失

  4. Java基础知识➣网络Socket(六)

    概述 网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来. java.net 包中提供了两种常见的网络协议的支持: TCP:TCP 是传输控制协议的缩写,它保障了两个应用程序之 ...

  5. 【Android】Android 中string-array的用法

    在Android中,用string-array是一种简单的提取XML资源文件数据的方法. 例子如下: 把相应的数据放到values文件夹的arrays.xml文件里 <?xml version= ...

  6. MySQL常用引擎的锁机制

    一.引言                                                                                                 ...

  7. nginx限制单个IP的最大连接数量限制下载速度

    今天seafile服务因为测试在下载文件的时候,带宽占用过大,导致seafile客户端无法登陆的问题. 我们公司的seafile是通过nginx代理的8000端口,因此我这边通过修改nginx配置来解 ...

  8. sql 将一列一逗号分隔拼成字符串

    select stuff((select ','+w.Waybillno from Web_Way_Waybill w where w.IsValid<>'Y' AND w.TruckOr ...

  9. 如何使用java代码启动tomcat和打开浏览器

    1.用于代码启动tomcat,也可以用代码运行电脑应用程序 public static void main(String[] args) { /* new MyThread().start(); ne ...

  10. 046 Oracle执行慢的SQL

    -- 执行最慢的sql SELECT * FROM (SELECT sa.SQL_TEXT, sa.SQL_FULLTEXT, sa.EXECUTIONS as "exeCount" ...