HDU 1978 How many ways

时间:2021-04-17
本文章向大家介绍HDU 1978 How many ways,主要包括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;
}

原文地址:https://www.cnblogs.com/fxh0707/p/14670901.html