牛客寒假3-A |dp走格子
地址:https://ac.nowcoder.com/acm/contest/3004/A
思路
转载题解
dp[i][j]表示走到坐标为(i,j)的方案数;由当前格子方案数推下一步要走的格子方案
初始化:dp[1][1]=1; 表示走到坐标1,1点的方案数是1
代码
代码1:由当前格子方案数推下一步要走的格子方案
#include <bits/stdc++.h>
using namespace std;
const long long mod=1e9+7;
const int MAXN=55;
long long dp[MAXN][MAXN];
char mp[MAXN][MAXN];
int n,m;
int main()
{
scanf("%d %d",&n,&m);
for(int i=1;i<=n;++i)
{
scanf("%s",mp[i]+1);
}
dp[1][1]=1;
for(int i=1;i<=n;++i)
{
for(int j=1;j<=m;++j)
{
if(mp[i][j]=='D')
{
dp[i+1][j]=(dp[i+1][j]+dp[i][j])%mod;
}
if(mp[i][j]=='R')
{
dp[i][j+1]=(dp[i][j+1]+dp[i][j])%mod;
}
if(mp[i][j]=='B')
{
dp[i+1][j]=(dp[i+1][j]+dp[i][j])%mod;
dp[i][j+1]=(dp[i][j+1]+dp[i][j])%mod;
}
}
}
printf("%lld\n",dp[n][m]);
return 0;
}
代码2:队友代码 由上一步格子方案数推到达当前格子的方案
#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int maxn = 2e5+5;
const ll mod = 1e9+7;
ll a[maxn];
ll dp[55][55];
char g[55][55];
int main(){
int n,m;
cin>>n>>m;
vector<string> v;
for(int i = 1;i<=n;i++){
string s;
cin>>s;
v.push_back(s);
}
for(int i = 1;i<=n;i++){
for(int j = 1;j<=m;j++){
g[i][j] = v[i-1][j-1];
}
}
//初始化边界
dp[1][1] = 1;
for(int i = 2;i<=m;i++){
if(g[1][i-1] == 'R' || g[1][i-1] == 'B') dp[1][i] = dp[1][i-1];
}
for(int i = 2;i<=n;i++){
if(g[i-1][1] == 'B' || g[i-1][1] == 'D') dp[i][1] = dp[i-1][1];
}
//递推
for(int i = 2;i<=n;i++){
for(int j = 2;j<=m;j++){
if(g[i][j-1] == 'B'|| g[i][j-1] == 'R'){
dp[i][j] = (dp[i][j-1] + dp[i][j] )%mod;
}
if(g[i-1][j] == 'D' || g[i-1][j] == 'B'){
dp[i][j] = (dp[i-1][j] + dp[i][j] )%mod;
}
}
}
cout<<dp[n][m];
return 0;
}