http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1486

1486 大大走格子

题目来源: CodeForces
基准时间限制:1 秒 空间限制:131072 KB 分值: 160 难度:6级算法题
收藏
关注

有一个h行w列的棋盘,里面有一些格子是不能走的,现在要求从左上角走到右下角的方案数。

Input
单组测试数据。
第一行有三个整数h, w, n(1 ≤ h, w ≤ 10^5, 1 ≤ n ≤ 2000),表示棋盘的行和列,还有不能走的格子的数目。
接下来n行描述格子,第i行有两个整数ri, ci (1 ≤ ri ≤ h, 1 ≤ ci ≤ w),表示格子所在的行和列。
输入保证起点和终点不会有不能走的格子。
Output
输出答案对1000000007取余的结果。
Input示例
3 4 2
2 2
2 3
Output示例
2
 跟前面做过的很类似,但是增加了一些障碍格子,很闹心啊。。。容斥也不太懂,看了dp的作法还挺好懂的把,写的太丑被卡时一早上。。。
我们不妨计算出所有的方案然后减去有障碍格子的方案,令f[i]表示从(1,1)到第i个障碍点的合法路径,也就是说除了i点,路径上得点都合法。
这样的话不难得出方程  f[i]=C(xi+yi-2,xi-1)-Σj=1i-1f[j]*C(xi+yi-xj-yj,xi-xj) ;
这个方程相当于枚举了所有不合法的路径中第一个障碍格子,显然之后的所有路径都至少包含一个障碍格,所以都是非法的,
这个方程前面就是所有的路径方案,后面就是所有的包含障碍的路径方案,减去就是要求的状态了,
显然对于(a,b)-(c,d)格子间所有的路径数我们根据组合数能轻易的得到,打表就好了,注意并不是i之前的所有点都一定能到达i,记得判断一下。
如果把(h,w)看做是一个最后的障碍点的话,ans=f[n+1].
 #include<bits/stdc++.h>
using namespace std;
#define LL long long
LL mod=1e9+;
LL dp[];
LL f[],inv[];
struct node{int x,y;}P[];
int read(){
int x=;char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) x=x*+c-'',c=getchar();
return x;
}
bool cmp(node A,node B)
{
if(A.x==B.x) return A.y<B.y;
return A.x<B.x;
}
LL qpow(LL a,LL b)
{
LL r=;
while(b){
if(b&) r=r*a%mod;
a=a*a;
b>>=;
}
return r;
}
inline LL C(LL N,LL M) {return f[N]*inv[M]%mod*inv[N-M]%mod;}
int main()
{
LL h,w,n,i,j,k;
scanf("%lld%lld%lld",&h,&w,&n);
for(i=;i<=n;++i) P[i].x=read(),P[i].y=read();
sort(P+,P++n,cmp);
P[n+].x=h; P[n+].y=w;
inv[]=f[]=;
for(i=;i<=h+w;++i)
{
f[i]=i*f[i-]%mod;
inv[i]=qpow(f[i],mod-);
}
dp[]=C(P[].x+P[].y-,P[].x-);
for(i=;i<=n+;++i)
{
LL s=;
for(j=;j<i;++j)
{
if(P[j].x<=P[i].x&&P[j].y<=P[i].y)
s=(s+dp[j]*C(P[i].x+P[i].y-P[j].x-P[j].y,P[i].x-P[j].x))%mod;
}
dp[i]=(C(P[i].x+P[i].y-,P[i].x-)-s+mod)%mod;
}
printf("%lld\n",dp[n+]);
return ;
}

51nod 1486的更多相关文章

  1. 51nod 1486 大大走格子(容斥原理)

    1486 大大走格子 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 160 难度:6级算法题   有一个h行w列的棋盘,里面有一些格子是不能走的,现在要 ...

  2. 51nod 1486 大大走格子——容斥

    题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1486 已知起点到某个障碍点左上角的所有点的不经过障碍的方案数,枚举 ...

  3. 51Nod 1486 大大走格子 —— 容斥

    题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1486 对于每个点,求出从起点到它,不经过其他障碍点的方案数: 求一 ...

  4. 51Nod 1486 大大走格子 —— 组合数学

    题目链接:https://vjudge.net/problem/51Nod-1486 1486 大大走格子 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: ...

  5. 51nod 1486 大大走格子(DP+组合数学)

    枚举不合法点的思想. 把障碍x坐标为第一关键字,y坐标为第二关键字排序.f[i]表示走到第i个障碍的方案数. f[i]=C(x[i]+y[i]-2,x[i]-1)-sigma(f[j]*C(x[i]- ...

  6. 51nod 1486 大大走格子——dp

    有一个h行w列的棋盘,里面有一些格子是不能走的,现在要求从左上角走到右下角的方案数. Input 单组测试数据. 第一行有三个整数h, w, n(1 ≤ h, w ≤ 10^5, 1 ≤ n ≤ 20 ...

  7. 51nod 1486 大大走格子(容斥+dp+组合数)

    传送门 解题思路 暴力容斥复杂度太高,无法接受,考虑用\(dp\).设\(f(i)\)表示从左上角开始不经过前面的阻断点,只经过\(i\)的阻断点.那么可以考虑容斥,用经过\(i\)的总方案数减去前面 ...

  8. AtCoder Regular Contest 058

    这个应该是第一场有英文的atcoder吧??不过题解却没有英文的... 从前往后慢慢做... C こだわり者いろはちゃん / Iroha's Obsession 数据范围这么小,直接暴力 #inclu ...

  9. 【51NOD】1486 大大走格子

    [算法]动态规划+组合数学 [题意]有一个h行w列的棋盘,定义一些格子为不能走的黑点,现在要求从左上角走到右下角的方案数. [题解] 大概能考虑到离散化黑点后,中间的空格子直接用组合数计算. 然后解决 ...

随机推荐

  1. Python获取指定路径下所有文件的绝对路径

    需求 给出制定目录(路径),获取该目录下所有文件的绝对路径: 实现 方式一: import os def get_file_path_by_name(file_dir): ''' 获取指定路径下所有文 ...

  2. mysql 关于join的总结

    本文地址:http://www.cnblogs.com/qiaoyihang/p/6401280.html mysql不支持Full join,不过可以通过UNION 关键字来合并 LEFT JOIN ...

  3. 吴超老师课程---Hadoop的伪分布安装

    1.1 设置ip地址    执行命令    service network restart    验证:         ifconfig1.2 关闭防火墙    执行命令    service ip ...

  4. 我们为什么使用ORM

    我们为什么使用ORM? http://www.cnblogs.com/tansm/archive/2006/06/07/419927.html 博客园在推广ORM方面的确做了很大的贡献,很多的程序员开 ...

  5. 经典iOS第三方库源码分析 - YYModel

    YYModel介绍 YYModel是一个针对iOS/OSX平台的高性能的Model解析库,是属于YYKit的一个组件,创建是ibireme. 其实在YYModel出现之前,已经有非常多的Model解析 ...

  6. hadoop15---activemq

    java JMS技术 JMS是规范,activeMQ是实现. 用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信. 它类似于JDBC,JDBC 是可以用来访问许多不同关系数据库的 API. ...

  7. ASP.NET MVC Bootstrap模板选中菜单高亮显示当前项方法

    当我们处理后台显示当前页面,当前页菜单项高亮,我们可以使用js方法,也可用程序实现,使用Bootstrap模板处理高亮并展开方法之一 1.在项目中导入 <script src="/as ...

  8. 20145235李涛《网络对抗》Exp8 Web基础

    基础问答 什么是表单 可以收集用户的信息和反馈意见,是网站管理者与浏览者之间沟通的桥梁. 表单包括两个部分:一部分是HTML源代码用于描述表单(例如,域,标签和用户在页面上看见的按钮),另一部分是脚本 ...

  9. python标准库学习-SimpleHTTPServer

    这是一个专题 记录学习python标准库的笔记及心得 简单http服务 SimpleHTTPServer 使用 python -m SimpleHTTPServer 默认启动8000端口 源码: &q ...

  10. Spring Boot 中使用jsp

    接SpringBoot 快速入门(Eclipse): 步骤一:视图支持 Springboot的默认视图支持是Thymeleaf,但是Thymeleaf我们不熟悉,我们熟悉的还是jsp. 所以下面是讲解 ...