题目描述##

你现在在一个\(n×m\)的迷宫的左上角(即点\((1,1)\)),你的目标是到达迷宫的右下角(即点\((n,m)\))。一次移动你只能向右或者是向下移动一个单位。比如在点\((x,y)\)你可以移动到点\((x+1,y)\)或点\((x,y+1)\)

迷宫中的一些点是岩石,当你移动到一个有岩石的点时岩石将被推到你移动方向的下一个点(你可以把岩石想象成推箱子游戏中的箱子),而如果那个点上也有一个岩石,它就会被按相同方向推的更远,以此类推(比如当前点右边有连着的一些岩石,你向右走一个点这些岩石就都会被向右推一个点)

这个迷宫被不可移动或是摧毁的墙包围着,石头是不允许被推到墙外或者摧毁墙的。(比如你右边有一个石头,而再往右是墙,你就不能往右移动了)

现在,请你计算出有多少种不同的可以到达终点的方案,由于方案数可能很大,结果请对\(10^9+7\)取模。两条路径中如果有任意的至少一个点不同,那就认为这两种方案是不同的。

输入格式##

输入第一行是两个正整数\(n,m\),表示迷宫的长和宽\((1≤n,m≤2000)\)

然后有\(n\)行,每行\(m\)个字符,如果第\(i\)行的第\(j\)个字符是"R",那就说明点\((i,j)\)存在一块岩石,如果是".",那就说明点\((i,j)\)是空的

数据保证出发点\((1,1)\)一定是空的

输出格式##

输出一个整数,表示从\((1,1)\)走到\((n,m)\)的方案数对\(10^9+7\)取模的结果。

样例说明##

第一个样例中,不需要移动就能到达终点,所以只有一种路径方案,输出\(1\)

第二个样例中终点被岩石挡住了,无法到达,所以没有方案可以到达终点,输出\(0\)

点击本网址可以看到第三个样例的例图 https://assets.codeforces.com/rounds/1225/index.html

输入输出样例##

输入#1:#

  1. 1 1
  2. .

输出#1:#

  1. 1

输入#2:#

  1. 2 3
  2. ...
  3. ..R

输出#2:#

  1. 0

输入#3#

  1. 4 4
  2. ...R
  3. .RR.
  4. .RR.
  5. R...

输出#3:#

  1. 4

原题CF1225E

假如岩石不能移动,那么这就是一道\(dp\)裸题。

但是岩石的移动影响了原图,导致不能用\(dp\)转移。

由于只能向右或向下,通过画图分析我们知道当到达格\((x,y)\)的方向

与从\((x,y)\)转移的方向不同时,转移后到目标的所有路径是不受上一

步的影响,还是原图。

所以我们可以用\(dp\),在当前点向(到达这点的不同方向)用\(O(n或m)\)

的时间转移,可以优化到\(O(n^2(n+m))\)。

发现当前dp值是一段区间的dp值的和 (\(dp[i][j][0]=dp[i+1][j][1]+dp[i+2][j][1]...\)) ,所以用后缀和优化一下。

总的复杂度是\(O(nm)\)

代码实现:

  1. #include<iostream>
  2. #include<cmath>
  3. #include<cstring>
  4. #include<cstdio>
  5. #include<ctime>
  6. #include<climits>
  7. #include<algorithm>
  8. #define ll long long
  9. using namespace std;
  10. const int N=2010,mod=1e9+7;
  11. int dp[N][N][2],sum[N][N][2],n,m,cnt[N][N][2]; //0 down 1 right
  12. char ch[N][N];
  13. int main()
  14. {
  15. int i,j,tmp;
  16. scanf("%d%d",&n,&m);
  17. for(i=1;i<=n;i++) scanf("%s",ch[i]+1);
  18. for(i=1;i<=n;i++) for(j=m;j>=1;j--) cnt[i][j][1]=cnt[i][j+1][1]+(ch[i][j]=='.');
  19. for(j=1;j<=m;j++) for(i=n;i>=1;i--) cnt[i][j][0]=cnt[i+1][j][0]+(ch[i][j]=='.');
  20. //预处理点(i,j)下可移动步数
  21. if(ch[n][m]=='R') cout<<0,exit(0);
  22. if(n==1 && m==1) cout<<1,exit(0);
  23. dp[n][m][0]=dp[n][m][1]=1;
  24. sum[n][m][0]=sum[n][m][1]=1;
  25. //dp[i][j][0]表示(i,j)下一步是向下走
  26. for(i=n;i>=1;i--)
  27. {
  28. for(j=m;j>=1;j--)
  29. {
  30. if(i==n && j==m) continue;
  31. tmp=cnt[i+1][j][0];
  32. dp[i][j][0]=(sum[i+1][j][1]-sum[i+tmp+1][j][1]+mod)%mod; //到达点(i,j)是从(i-1,j)转移过来的,所以取向右的后缀和
  33. tmp=cnt[i][j+1][1];
  34. dp[i][j][1]=(sum[i][j+1][0]-sum[i][j+tmp+1][0]+mod)%mod;
  35. sum[i][j][0]=(sum[i][j+1][0]+dp[i][j][0])%mod; //更新后缀和
  36. sum[i][j][1]=(sum[i+1][j][1]+dp[i][j][1])%mod;
  37. }
  38. }
  39. cout<<(dp[1][1][0]+dp[1][1][1])%mod;
  40. return ~~(0-0);
  41. }

【CF1225E Rock Is Push】推岩石的更多相关文章

  1. CF1225E Rock Is Push (计数)

    观察性质计数题orz小贺 考场上跟榜才切 我们只能往下和往右走,那么只有连续的往下和往右可能会造成不合法的情况!如果当前这一步是向右,那么只有它前面连续的一段向右可能影响到它. 考虑把连续的向右/下一 ...

  2. [CodeForces - 1225E]Rock Is Push 【dp】【前缀和】

    [CodeForces - 1225E]Rock Is Push [dp][前缀和] 标签:题解 codeforces题解 dp 前缀和 题目描述 Time limit 2000 ms Memory ...

  3. Codeforces Round #596 (Div. 2, based on Technocup 2020 Elimination Round 2) E. Rock Is Push dp

    E. Rock Is Push You are at the top left cell (1,1) of an n×m labyrinth. Your goal is to get to the b ...

  4. iPhone的Push(推送通知)功能原理浅析

    第一部分:Push原理(以下绝大多数内容参考自.图片来自iPhone OS Reference Library)机制简介Push 的工作机制可以简单的概括为下图图中,Provider是指某个iPhon ...

  5. 58同城高性能移动Push推送平台架构演进之路

    本文详细讲述58同城高性能移动Push推送平台架构演进的三个阶段,并介绍了什么是移动Push推送,为什么需要,原理和方案对比:移动Push推送第一阶段(单平台)架构如何设计:移动Push推送典型性能问 ...

  6. 转: 58同城高性能移动Push推送平台架构演进之路

    转: http://geek.csdn.net/news/detail/58738 文/孙玄 本文详细讲述58同城高性能移动Push推送平台架构演进的三个阶段,并介绍了什么是移动Push推送,为什么需 ...

  7. 移动端Push推送

    移动端Push推送 移动端开发逃不掉要做推送,这里给出服务端一种省时省力的解决方案. iOS:PushSharp.Apple.苹果有自己的推送服务,我们按照规则推送数据就好.这里我选取PushShar ...

  8. 浅谈push推送的一点感受

    在手机已成为生活必不可分的一部分,push服务伴随而来.ios的apns,android随着谷歌退出中国市场,各家在android的推送不断展开.有厂商的推送,如小米.华为.魅族.oppo等,还有中间 ...

  9. push推送服务设计

    PUSH系统架构设计简述 一.网络传输协议的选择 PUSH系统协议选取: UDP协议实时性更好,但是如何处理安全可靠的传输并且处理不同客户端之间的消息交互是个难题,实现起来过于复杂,那就非TCP协议莫 ...

随机推荐

  1. css3做ipone当时的滑动解锁闪亮条

    现在一般的登录 注册 什么  的页面,都是会做个滑动验证.一般都是像IPONE早期那个 滑动开屏的效果 ,这个效果现在可以用CSS3来实现. 主要用到几个属性 background 背景使用渐变属性, ...

  2. CSS 标签显示模式

    标签的类型(显示模式) HTML标签一般分为块标签和行内标签两种类型,它们也称块元素和行内元素. 一.块级元素(block-level) 每个块元素通常都会独自占据一整行或多整行,可以对其设置宽度.高 ...

  3. 基于RSA的WEB前端密码加密方案

    受制于WEB页面源码的暴露,因此传统的对称加密方案以及加密密钥都将暴露在JS文件中,同样可以被解密. 目前比较好的解决方案是WEB页面全程或用户登录等关键环节使用HTTPS进行传输. 另外一种解决方案 ...

  4. SpringCloud SpringBoot 前后端分离企业级微服务架构源码赠送

    基于SpringBoot2.x.SpringCloud和SpringCloudAlibaba并采用前后端分离的企业级微服务敏捷开发系统架构.并引入组件化的思想实现高内聚低耦合,项目代码简洁注释丰富上手 ...

  5. FFMPEG 命令行工具- ffplay

    ffplay 简介 ffplay是ffmpeg工程中提供的播放器,功能相当的强大,凡是ffmpeg支持的视音频格式它基本上都支持.甚至连VLC不支持的一些流媒体都可以播放,但是它的缺点是其不是图形化界 ...

  6. H3C 无线交换机和FIT AP的典型连接

  7. Odoo字段类型详解

    转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/10826099.html   一:基本字段类型 Binary:二进制类型,用于保存图片.视频.文件.附件等,在 ...

  8. html中对应Word中的字体和字号

    原文链接:https://blog.csdn.net/xuexizhe88/article/details/79277587:https://blog.csdn.net/qq_31603575/art ...

  9. Nginx配置文件、优化详解

    上篇<编译安装nginx>已将nginx安装好,这篇写nginx配置文件和部分优化参数. 查看nginx的配置文件路径,可以使用nginx配置文件检查命令nginx -t: [root@n ...

  10. Windows Server 2008 R2 忘记密码的处理方法

    这篇文章主要介绍了Windows Server 2008 R2 忘记密码的处理方法,一般两种方法,一种是软件方法一种是通过系统安装盘实现的,这里久违大家分享一下需要的朋友可以参考下 遗忘Windows ...