HDU 1978 How many ways

刷表法。

对于某一个点\((i,j)\),直接求出\((i,j)\)所能到达的所有点,将能到达的点的方案数量加上\((i,j)\)的方案数量。

状态表示:
\(f(i,j)\):达到点\((i,j)\)的方案数。

状态转移:

\[f(i+x,j+y)+=f(i,j) \\ 其中,x+y \le w[i][j] \]

const int N=110;
int g[N][N];
int f[N][N];
int n,m;

bool check(int x,int y)
{
    return x>=1 && x<=n && y>=1 && y<=m;
}

int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        memset(f,0,sizeof f);
        cin>>n>>m;

        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                cin>>g[i][j];

        f[1][1]=1;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                for(int k=0;k<=g[i][j];k++)  // 枚举这个点能到的所有点
                    for(int l=0;l+k<=g[i][j];l++)
                    {
                        if(k == 0 && l == 0) continue;  // 起始点除外
                        int a=i+k,b=j+l;
                        if(check(a,b))
                            f[a][b]=(f[a][b]+f[i][j])%mod;
                    }

        cout<<f[n][m]<<endl;
    }
    //system("pause");
    return 0;
}
posted @ 2021-04-17 15:45  Dazzling!  阅读(42)  评论(0编辑  收藏  举报