一道常规的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); }