题解:本题使用动态规划,对时间和空间复杂度都是最优的。
dp解析:因为一个格子只能从自己的上方和左方到达,所以从(1,1)到达(i,j)的方法数就是上方格子的方法数加上左方格子的方法数(前提是左方和右方的格子能够走到(i,j))
代码如下:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
const long long mod=1e9+7;
int n,m;
char a[60][60];//a[n][m]
long long int dp[60][60];
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>a[i][j];
}
}
dp[1][1]=1;
for(int i=2;i<=m;i++)
{
if(a[1][i-1]=='R'||a[1][i-1]=='B')
dp[1][i]=dp[1][i-1];
else
dp[1][i]=0;
}
for(int i=2;i<=n;i++)
{
if(a[i-1][1]=='D'||a[i-1][1]=='B')
dp[i][1]=dp[i-1][1];
else
dp[i][1]=0;
}
for(int i=2;i<=n;i++)
{
for(int j=2;j<=m;j++)
{
if(a[i][j-1]=='B'||a[i][j-1]=='R')
dp[i][j]=(dp[i][j]%mod+dp[i][j-1]%mod)%mod;
if(a[i-1][j]=='D'||a[i-1][j]=='B')
dp[i][j]=(dp[i][j]%mod+dp[i-1][j]%mod)%mod;
}
}
cout<<dp[n][m];
return 0;
}