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 bottom right cell (n,m). You can only move right or down, one cell per step. Moving right from a cell (x,y) takes you to the cell (x,y+1), while moving down takes you to the cell (x+1,y).
Some cells of the labyrinth contain rocks. When you move to a cell with rock, the rock is pushed to the next cell in the direction you're moving. If the next cell contains a rock, it gets pushed further, and so on.
The labyrinth is surrounded by impenetrable walls, thus any move that would put you or any rock outside of the labyrinth is illegal.
Count the number of different legal paths you can take from the start to the goal modulo 109+7. Two paths are considered different if there is at least one cell that is visited in one path, but not visited in the other.
Input
The first line contains two integers n,m — dimensions of the labyrinth (1≤n,m≤2000).
Next n lines describe the labyrinth. Each of these lines contains m characters. The j-th character of the i-th of these lines is equal to "R" if the cell (i,j) contains a rock, or "." if the cell (i,j) is empty.
It is guaranteed that the starting cell (1,1) is empty.
Output
Print a single integer — the number of different legal paths from (1,1) to (n,m) modulo 109+7.
Examples
input
1 1
.
output
1
input
2 3
...
..R
output
0
input
4 4
...R
.RR.
.RR.
R...
output
4
Note
In the first sample case we can't (and don't have to) move, hence the only path consists of a single cell (1,1).
In the second sample case the goal is blocked and is unreachable.
Illustrations for the third sample case can be found here: https://subdomain.codeforc.es/menci/assets/rounds/1225/index.html
题意
一个n*m的矩阵,里面有一堆箱子,你可以推箱子,连续的箱子你也能推动。
问你从(1,1)到(n,m)有多少种不同路径的方案个数。
题解
定义:
dp[i][j][0]表示从(i,j)往下走到达终点的方案数。
dp[i][j][1]表示从(i,j)往右走到达终点的方案数。
比较显然的
dp[i][j][0]=dp[i+1][j][1]+dp[i+2][j][1]+....+dp[i+x][j][1],直到(i+x+1,j)是一个箱子推到底了,不能再推箱子了。
同理dp[i][j][1]也是如此。
显然后面这坨可以用前缀和优化一下,然后就可以变成n^2的dp转移了。
代码
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2005;
int n,m;
const int mod = 1e9+7;
char a[maxn][maxn];
// 0 for down;1 for right
int num[maxn][maxn][2],dp[maxn][maxn][2],sum[maxn][maxn][2];
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%s",a[i]+1);
}
if(n==1&&m==1&&a[1][1]=='.'){
cout<<"1"<<endl;
return 0;
}
if(a[1][1]=='R'||a[n][m]=='R'){
cout<<"0"<<endl;
return 0;
}
for(int i=n;i>=1;i--){
for(int j=m;j>=1;j--){
if(a[i][j]=='R'){
num[i][j][0]+=1;
num[i][j][1]+=1;
}
num[i][j][0]+=num[i+1][j][0];
num[i][j][1]+=num[i][j+1][1];
}
}
dp[n][m][0]=1;dp[n][m][1]=1;sum[n][m][0]=1;sum[n][m][1]=1;
for(int i=n;i>=1;i--){
for(int j=m;j>=1;j--){
if(i==n&&j==m)continue;
dp[i][j][0]=(sum[i+1][j][0]-sum[n-num[i+1][j][0]+1][j][0])%mod;
dp[i][j][1]=(sum[i][j+1][1]-sum[i][m-num[i][j+1][1]+1][1])%mod;
sum[i][j][0]=(sum[i+1][j][0]+dp[i][j][1])%mod;
sum[i][j][1]=(sum[i][j+1][1]+dp[i][j][0])%mod;
}
}
cout<<(dp[1][1][0]+dp[1][1][1]+2ll*mod)%mod<<endl;
}
Codeforces Round #596 (Div. 2, based on Technocup 2020 Elimination Round 2) E. Rock Is Push dp的更多相关文章
- Codeforces Round #596 (Div. 2, based on Technocup 2020 Elimination Round 2)
A - Forgetting Things 题意:给 \(a,b\) 两个数字的开头数字(1~9),求使得等式 \(a=b-1\) 成立的一组 \(a,b\) ,无解输出-1. 题解:很显然只有 \( ...
- Codeforces Round #596 (Div. 2, based on Technocup 2020 Elimination Round 2) D. Power Products
链接: https://codeforces.com/contest/1247/problem/D 题意: You are given n positive integers a1,-,an, and ...
- Codeforces Round #596 (Div. 2, based on Technocup 2020 Elimination Round 2) C. p-binary
链接: https://codeforces.com/contest/1247/problem/C 题意: Vasya will fancy any number as long as it is a ...
- Codeforces Round #596 (Div. 2, based on Technocup 2020 Elimination Round 2) B2. TV Subscriptions (Hard Version)
链接: https://codeforces.com/contest/1247/problem/B2 题意: The only difference between easy and hard ver ...
- Codeforces Round #596 (Div. 2, based on Technocup 2020 Elimination Round 2) A. Forgetting Things
链接: https://codeforces.com/contest/1247/problem/A 题意: Kolya is very absent-minded. Today his math te ...
- Codeforces Round #596 (Div. 2, based on Technocup 2020 Elimination Round 2) F. Tree Factory 构造题
F. Tree Factory Bytelandian Tree Factory produces trees for all kinds of industrial applications. Yo ...
- Codeforces Round #596 (Div. 2, based on Technocup 2020 Elimination Round 2) B. TV Subscriptions 尺取法
B2. TV Subscriptions (Hard Version) The only difference between easy and hard versions is constraint ...
- Codeforces Round #596 (Div. 2, based on Technocup 2020 Elimination Round 2) A. Forgetting Things 水题
A. Forgetting Things Kolya is very absent-minded. Today his math teacher asked him to solve a simple ...
- Codeforces Round #596 (Div. 2, based on Technocup 2020 Elimination Round 2) D. Power Products 数学 暴力
D. Power Products You are given n positive integers a1,-,an, and an integer k≥2. Count the number of ...
随机推荐
- Windows10 下利用Hyper-V安装CentOS系统
开启Windows10的Hyper-v功能(需要重启电脑) 控制面板→程序→启用或关闭Windows功能→打开Hyper-v→确定 创建虚拟机 在Windows管理工具中找到Hyper-v管理器并双击 ...
- 【CodeForces】CodeForcesRound594 Div1 解题报告
点此进入比赛 \(A\):Ivan the Fool and the Probability Theory(点此看题面) 大致题意: 给一个\(n\times m\)的矩阵\(01\)染色,使得不存在 ...
- Codeforces Round #602 (Div. 2, based on Technocup 2020 Elimination Round 3) C. Messy 构造
C. Messy You are fed up with your messy room, so you decided to clean it up. Your room is a bracket ...
- Java连载46-Java中的多态
一.多态的语法 1.关于多态中涉及到几个概念 (1)向上转型(upcasting) 子类型转换为父类型,又被称为自动类型转换 (2)向下转型(downcasting) 父类型转换为子类型,又被称为强制 ...
- Yii2处理密码加密及验证
在Yii2中提供了密码加密以及验证的一系列方法,方便我们的使用,它使用的是bcrypt算法.查看源码我们可以发现它使用的是PHP函数password_hash()和crypt()生成. 加密: /** ...
- 1+x证书web前端开发jquery专项练习测试题
javascript程序设计-题库 1.下面哪一种不属于Jquery的选择器? A. 基本选择器 B. 层次选择器 C. 表单选择器 D. 节点选择器 答案: D 2.如果需要匹配包含文本的元素,用下 ...
- 【Oracle】Oracle常用命令整理(持续更新中)
一些常用的操作命令记录 SQLPlus连接 sqlplus {username}/{password}@{ip}:{port}/{sid} 创建用户 create user testuser iden ...
- jQuery 源码分析(十四) 数据操作模块 类样式操作 详解
jQuery的属性操作模块总共有4个部分,本篇说一下第3个部分:类样式操作部分,用于修改DOM元素的class特性的,对于类样式操作来说,jQuery并没有定义静态方法,而只定义了实例方法,如下: a ...
- 记一次token安全认证的实践
阅读此文前请先阅读上一篇SpringBoot整合JWT实现用户认证了解JWT. 背景介绍: 因项目需求,有PC端 APP端和小程序端,但登陆接口是同一个,然而微服务也无法使用传统的session解决用 ...
- Spring5源码解析2-register方法注册配置类
接上回已经讲完了this()方法,现在来看register(annotatedClasses);方法. // new AnnotationConfigApplicationContext(AppCon ...