CodeForces 559C Gerald and Gia (格路+容斥+DP)
CodeForces 559C Gerald and Gia
大致题意:有一个 $ N\times M $ 的网格,其中有些格子是黑色的,现在需要求出从左上角到右下角不经过黑色格子的方案数(模 $ 10^9+7 $ )
$ solution: $
首先 $ orz $ 鸽王,看一眼就说:“嗯?这不就是一道格路+容斥的小水题吗?”,然后秒切大火题。
这道题主要考验我们如何设置动态规划的状态以保证不重不漏的算好所有情况。上一次我发这类“找基准点”的DP题解应该是POJ 1737 Connected Graph 这两道题都要求我们要精确的计算所有情况,我们都需要去构思一种可以囊括所有情况且不会重复的方案。
这一题首先讲一个基本知识:在一个 $ N\times M $ 的网格里,从左上角到右下角的方案数就是: $ C^{N-1}_{N+M-2} $ ,这个可以很好理解:我们从左上角走到右下角总共会走 $ N+M-2 $ 步,而我们只需要在这些步数里选择有那几步是向下走的即可。然后我们回来分析题目,这道题我们很难直接算,只能循序渐进,也就是用最优子结构来得出最优答案,而且这是完全没有后效性的。但是如果我们将从左上角到每一个格子的方案都求出来,这道题的数据范围就很不友好。不过我们发现它的黑色格子数目很少,于是我们可以反向思考,我们求出它会走过黑色格子的路径,这样就不会去跑一些没用的状态了。我们将黑色格子按照从左上角到右下角的顺序排序,然后以到每一个黑色格子的路径作为状态。但是这样我们发现会严重重复,所以我们必须想办法不重复。
为了不重复我们要顶一个基准点:就是这条路径到达的第一个黑色格子,我们只需要确定这第一个格子接下来的路随便走都没问题,于是我们要求出左上角到每一个黑色格子的不经过其他节点的路径(这不就是一个子问题吗?)于是问题迎刃而解。因为我们有办法求所有的经过黑色格子的路径进而反向得出不经过任何黑色格子的路径数。
$ code: $
#include<iostream>
#include<cstdio>
#include<iomanip>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#define ll long long
#define db double
#define rg register int
using namespace std;
const int mod=1e9+7;
int h,w,n;
int f[2005];
int jc[200015];
int inv[200015];
struct su{
int x,y;
inline bool operator <(su z){
return x!=z.x?x<z.x:y<z.y;
}
}a[2005];
inline int qr(){
register char ch; register bool sign=0; rg res=0;
while(!isdigit(ch=getchar())) if(ch=='-')sign=1;
while(isdigit(ch)) res=res*10+(ch^48),ch=getchar();
return sign?-res:res;
}
inline int C(int x,int y){
return (ll)jc[x]*inv[x-y]%mod*inv[y]%mod;
}
inline int ksm(ll x,int y){
rg res=1;
while(y){
if(y&1)res=res*x%mod;
x=x*x%mod; y>>=1;
}return res;
}
int main(){
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
h=qr(); w=qr(); n=qr();
jc[0]=jc[1]=inv[0]=1; rg tot=h+w+1;
for(rg i=2;i<=tot;++i)
jc[i]=(ll)jc[i-1]*i%mod;
inv[tot]=ksm(jc[tot],mod-2);
for(rg i=tot;i>1;--i)
inv[i-1]=(ll)inv[i]*i%mod;
for(rg i=1;i<=n;++i)
a[i].x=qr(),a[i].y=qr();
a[n+1].x=h; a[n+1].y=w; sort(a+1,a+n+2);
for(rg i=1;i<=n+1;++i){
f[i]=C(a[i].x+a[i].y-2,a[i].x-1);
for(rg j=1;j<i;++j){
if(a[i].x<a[j].x||a[i].y<a[j].y)continue;
f[i]=(f[i]-(ll)f[j]*C(a[i].x-a[j].x+a[i].y-a[j].y,a[i].x-a[j].x))%mod;
}
}printf("%d\n",(f[n+1]+mod)%mod);
return 0;
}
CodeForces 559C Gerald and Gia (格路+容斥+DP)的更多相关文章
- 【题解】CF559C C. Gerald and Giant Chess(容斥+格路问题)
[题解]CF559C C. Gerald and Giant Chess(容斥+格路问题) 55336399 Practice: Winlere 559C - 22 GNU C++11 Accepte ...
- HDU 5794 A Simple Chess (容斥+DP+Lucas)
A Simple Chess 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5794 Description There is a n×m board ...
- [CF1086E]Beautiful Matrix(容斥+DP+树状数组)
给一个n*n的矩阵,保证:(1)每行都是一个排列 (2)每行每个位置和上一行对应位置不同.求这个矩阵在所有合法矩阵中字典序排第几.考虑类似数位DP的做法,枚举第几行开始不卡限制,那么显然之前的行都和题 ...
- 【BZOJ3622】已经没有什么好害怕的了 容斥+DP
[BZOJ3622]已经没有什么好害怕的了 Description Input Output Sample Input 4 2 5 35 15 45 40 20 10 30 Sample Output ...
- $bzoj2560$ 串珠子 容斥+$dp$
正解:容斥+$dp$ 解题报告: 传送门$QwQ$ $umm$虽然题目蛮简练的了但还是有点难理解,,,我再抽象一点儿,就说有$n$个点,点$i$和点$j$之间有$a_{i,j}$条无向边可以连,问有多 ...
- Codeforces 1553I - Stairs(分治 NTT+容斥)
Codeforces 题面传送门 & 洛谷题面传送门 u1s1 感觉这道题放到 D1+D2 里作为 5250 分的 I 有点偏简单了吧 首先一件非常显然的事情是,如果我们已知了排列对应的阶梯序 ...
- codeforces B. Friends and Presents(二分+容斥)
题意:从1....v这些数中找到c1个数不能被x整除,c2个数不能被y整除! 并且这c1个数和这c2个数没有相同的!给定c1, c2, x, y, 求最小的v的值! 思路: 二分+容斥,二分找到v的值 ...
- Codeforces 439E Devu and Birthday Celebration 容斥
Devu and Birthday Celebration 我们发现不合法的整除因子在 m 的因子里面, 然后枚举m的因子暴力容斥, 或者用莫比乌斯系数容斥. #include<bits/std ...
- Codeforces.997C.Sky Full of Stars(容斥 计数)
题目链接 那场完整的Div2(Div1 ABC)在这儿.. \(Description\) 给定\(n(n\leq 10^6)\),用三种颜色染有\(n\times n\)个格子的矩形,求至少有一行或 ...
随机推荐
- 【Bzoj】1001狼抓兔子(平面图最小割转对偶图最短路)
YEAH 题目链接 终于做对这道题啦 建图的艰辛难以言表- - 顺便说一句我队列转STL啦 狼抓兔子的地图符合平面图定义,于是将该图转成对偶图并求出对偶图的最短路即可. 这篇博客给了我极大的帮助 ...
- BZOJ 4824 [Cqoi2017]老C的键盘 ——树形DP
每一个限制条件相当于一条有向边, 忽略边的方向,就成了一道裸的树形DP题 同BZOJ3167 唯一的区别就是这个$O(n^3)$能过 #include <map> #include < ...
- UVA 11297 Census ——二维线段树
[题目分析] 二维线段树模板题目. 简直就是无比的暴力.时间复杂度为两个log. 标记的更新方式比较奇特,空间复杂度为N^2. 模板题目. [代码] #include <cstdio> # ...
- Bzoj1083 1083: [SCOI2005]繁忙的都市【MST】
大水题,真不知道出题者是怎么把这么水的题出的这么长的TAT 其实这题在于考语文水平,一共三个要求,前两个要求意思就是要选出的道路是树形的,最后一个要求就是要权值最小,于是整个题意说白了就是求一棵MST ...
- mongodb的安装及环境配置
一 下载 官网:https://fastdl.mongodb.org/win32/mongodb-win32-x86_64-2008plus-ssl-3.6.3-signed.msi 官网可能打不开, ...
- PEP8 Python编码规范(转)
一 代码编排1 缩进.4个空格的缩进(编辑器都可以完成此功能),不使用Tap,更不能混合使用Tap和空格.2 每行最大长度79,换行可以使用反斜杠,最好使用圆括号.换行点要在操作符的后边敲回车.3 类 ...
- 一个关于 jquery 和 php 的 jsonp 例子(与后台PHP成功通信)
<script> $(document).ready(function(){ $.ajax({ url:'http://localhost/test/jsonp.php', dataTyp ...
- (47)C#运行时序列化
序列化是将对象或对象图转化成字节流的过程.反序列化是将字节流转换回对象图的过程.
- Croc Champ 2013 - Round 2 C. Cube Problem
问满足a^3 + b^3 + c^3 + n = (a+b+c)^3 的 (a,b,c)的个数 可化简为 n = 3*(a + b) (a + c) (b + c) 于是 n / 3 = (a + b ...
- C# 多线程小试牛刀
前言 昨天在上班时浏览博问,发现了一个问题,虽然自己在 C# 多线程上没有怎么尝试过,看了几遍 CLR 中关于 线程的概念和讲解(后面三章).也想拿来实践实践.问题定义是这样的: 对于多线程不是很懂, ...