Codeforces.348D.Turtles(容斥 LGV定理 DP)
\(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)的更多相关文章
- codeforces 348D Turtles
codeforces 348D Turtles 题意 题解 代码 #include<bits/stdc++.h> using namespace std; #define fi first ...
- 【UOJ#422】【集训队作业2018】小Z的礼物(min-max容斥,轮廓线dp)
[UOJ#422][集训队作业2018]小Z的礼物(min-max容斥,轮廓线dp) 题面 UOJ 题解 毒瘤xzy,怎么能搬这种题当做WC模拟题QwQ 一开始开错题了,根本就不会做. 后来发现是每次 ...
- [Hdu-5155] Harry And Magic Box[思维题+容斥,计数Dp]
Online Judge:Hdu5155 Label:思维题+容斥,计数Dp 题面: 题目描述 给定一个大小为\(N*M\)的神奇盒子,里面每行每列都至少有一个钻石,问可行的排列方案数.由于答案较大, ...
- CodeForces 348D Turtles(LGV定理)题解
题意:两只乌龟从1 1走到n m,只能走没有'#'的位置,问你两只乌龟走的时候不见面的路径走法有几种 思路:LGV定理模板.但是定理中只能从n个不同起点走向n个不同终点,那么需要转化.显然必有一只从1 ...
- bzoj 3782 上学路线 卢卡斯定理 容斥 中国剩余定理 dp
LINK:上学路线 从(0,0)走到(n,m)每次只能向上或者向右走 有K个点不能走求方案数,对P取模. \(1\leq N,M\leq 10^10 0\leq T\leq 200\) p=10000 ...
- cf348D. Turtles(LGV定理 dp)
题意 题目链接 在\(n \times m\)有坏点的矩形中找出两条从起点到终点的不相交路径的方案数 Sol Lindström–Gessel–Viennot lemma的裸题? 这个定理是说点集\( ...
- bzoj2669[cqoi2012]局部极小值 容斥+状压dp
2669: [cqoi2012]局部极小值 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 774 Solved: 411[Submit][Status ...
- LOJ3053 十二省联考2019 希望 容斥、树形DP、长链剖分
传送门 官方题解其实讲的挺清楚了,就是锅有点多-- 一些有启发性的部分分 L=N 一个经典(反正我是不会)的容斥:最后的答案=对于每个点能够以它作为集合点的方案数-对于每条边能够以其两个端点作为集合点 ...
- 【BZOJ】4767: 两双手【组合数学】【容斥】【DP】
4767: 两双手 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1057 Solved: 318[Submit][Status][Discuss] ...
随机推荐
- Windows批处理命令用法
阅读下面文字需要一定的dos基础概念,象:盘符.文件.目录(文件夹).子目录.根目录.当前目录 每个命令的完整说明请加 /? 参数参考微软的帮助文档可以看到,在 /? 帮助里,"命令扩展名& ...
- 步步為營-98-MyAPI
1 通过NuGet程序管理包添加 Microsoft Asp.Net webAPI 2.2 的引用 2 添加两个文件夹Controllers和Models 2.1 在本地模拟数据库,所以在Model ...
- 步步为营-87-imageAreaSelect插件使用(图片剪切)
1 引用文件 jquery.imgareaselect.min.cs imgareaselect-default.js 2 代码 <%@ Page Language="C#" ...
- 快速部署网络爬虫框架scrapy
1. 安装Anaconda,因为Anaconda基本把所有需要依赖的环境都一键帮我们部署好了,不需要再操心其他事了,进官网选择需要下载的版本:https://www.anaconda.com/down ...
- GAN-生成手写数字-Keras
from keras.models import Sequential from keras.layers import Dense from keras.layers import Reshape ...
- python 0007
#coding='utf-8'# import re import os def get_list(): list_file=[] for f in os.listdir(): if f.endswi ...
- windows下载安装MariaDB10.2.17 绿色版
1.下载 https://mirrors.tuna.tsinghua.edu.cn/mariadb//mariadb-10.2.17/winx64-packages/mariadb-10.2.17-w ...
- debian 下deb包的制作
http://page.renren.com/601230663/note/817856769?op=next&curTime=1333642042000
- js与jquery常用数组方法总结
昨天被问数组方法的时候,问到sort()方法是否会改变原来的数组.本来我猜是不会,也是这么说,马上我又觉得,知识这种东西,不确定的时候直接说不确定或不知道就好,只是凭借着不确定的猜测或者是记忆,害人害 ...
- ng2tree在ios中无法触发click
问题描述: 从其他页面跳转回ng2tree的页面时,无法触发节点的click事件 解决方案: 1. 在node_modules中搜索onNodeSeclected方法,修改click为touchend ...