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