一道常规的dp题,注意位于最后一行和位于第一列dp需要特判,然后如果是不能走的地方,就让dp[]=0
#include <bits/stdc++.h>
using namespace std;
const int mod=2333;
template<class T>inline void read(T &res)
{
char c;T flag=1;
while((c=getchar())<'0'||c>'9')
if(c=='-')
flag=-1;res=c-'0';
while((c=getchar())>='0'&&c<='9')
res=res*10+c-'0';
res*=flag;
}
int a[3010][3010];
int dp[3010][3010];
int m,n;
int main()
{
read(m);
read(n);
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
read(a[i][j]);
}
}
dp[m][1]=1;
for(int p=m;p>=1;p--)
{
for(int q=1;q<=n;q++)
{
if(a[p][q]==1)
dp[p][q]=0;
else{
if(p==m)
{
if(a[m][q-1]==0&&q>=2)
dp[p][q]=dp[p][q-1];
}
else if(q==1)
{
if(a[m+1][q]==0&&p<=m-1)
dp[p][q]=dp[p+1][q];
}
else
{
if(a[p+1][q]==0&&a[p][q-1]==0)
dp[p][q]=(dp[p+1][q]+dp[p][q-1])%mod;
else if(a[p+1][q]==1&&a[p][q-1]==0)
dp[p][q]=dp[p][q-1]%mod;
else if(a[p+1][q]==0&&a[p][q-1]==1)
dp[p][q]=dp[p+1][q]%mod;
}
}
}
}
//for(int i=1;i<=m;i++)
// for(int j=1;j<=n;j++)
// printf("%d ",dp[i][j]);
printf("%d\n",dp[1][n]%mod);
}


京公网安备 11010502036488号