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\)个格子的矩形,求至少有一行或 ...
随机推荐
- iOS NSLog各种打印
%@ 对象 %d,%i 整型 (%i的老写法) %hd 短整型 %ld , %lld 长整型 %u 无符整型 %f 浮点型和double型 %0.2f 精度浮点数,只保留两位小数 %x: 为32 ...
- Unity3D for iOS初级教程:Part 3/3
转自Unity 3D for iOS 这篇文章还可以在这里找到 英语 Learn how to use Unity to make a simple 3D iOS game! 这份教程是由教程团队成员 ...
- BZOJ 2134 单选错位 ——期望DP
发现概率是∑1/两道题答案相同的概率, 稍加化简 #include <map> #include <ctime> #include <cmath> #include ...
- BZOJ 2179 FFT快速傅立叶 ——FFT
[题目分析] 快速傅里叶变换用于高精度乘法. 其实本质就是循环卷积的计算,也就是多项式的乘法. 两次蝴蝶变换. 二进制取反化递归为迭代. 单位根的巧妙取值,是的复杂度成为了nlogn 范德蒙矩阵计算逆 ...
- [POJ2778]DNA Sequence(AC自动机 + DP + 矩阵优化)
传送门 AC自动机加DP就不说了 注意到 m <= 10,所以模式串很少. 而 n 很大就需要 log 的算法,很容易想到矩阵. 但是该怎么构建? 还是矩阵 A(i,j) = ∑A(i,k) * ...
- 刷题总结——谈笑风生(主席树+dfs序的应用)
题目: Description 设T 为一棵有根树,我们做如下的定义:• 设a和b为T 中的两个不同节点.如果a是b的祖先,那么称“a比b不知道高明到哪里去了”.• 设a 和 b 为 T 中的两个不同 ...
- POJ2486 Apple Tree
Time Limit: 1000MS Memory Limit: 65536KB 64bit IO Format: %lld & %llu Description Wshxzt is ...
- 自定义Navigation按钮及Title
导航栏自带的按钮,时常不能满足要求,所以深深需要进行各种定制. 写一个UINavigationItem的category // UINavigationItem+CB_ChangeButton.h ...
- Linux下使用vi新建文件保存文件时遇到错误:E212: Can't open file for writing
出现E212: Can't open file for writing的问题是由于权限问题导致的,解决方法有以下思路: 1.使用root进行登录,然后再操作. 2.在使用命令时,前面加sudo. 3. ...
- 彻底理解javascript 中的事件对象的pageY, clientY, screenY的区别和联系。
说到底, pageY, clientY, screenY的计算,就是要找到参考点, 它们的值就是: 鼠标点击的点----------- 和参考点指点----------的直角坐标系的距离 stacko ...