hdu 1978 How many ways

状态转移方程:dp[i+k][j+l] = (dp[i+k][j+l] + dp[i][j]) % 10000;

dp[i][j]表示到达点(i,j)的途径数, 其中k,l为处在点(i,j)时,能够到达点(i+k,j+l)。

 

#include <iostream>

#include <algorithm>

#include <cmath>

#include <cstdio>

#include <cstdlib>

#include <cstring>

#include <string>

#include <vector>

#include <set>

#include <queue>

#include <stack>

#include <climits>//形如INT_MAX一类的

#define MAX 105

#define INF 0x7FFFFFFF

# define eps 1e-5

using namespace std;



int dp[MAX][MAX],map[MAX][MAX];

int n,m;



void solve()

{

    dp[0][0] = 1;

    int i,j,k,l;

    for(i=0; i<n; i++)

        for(j=0; j<m; j++)

        {

            int t = map[i][j];

            for(k=0; k<=t; k++)

            {

                if(i+k >= n)

                    break;

                for(l=0; l+k<=t; l++)

                {

                    if(l+j >= m)

                        break;

                    if(k == 0 && l == 0)

                        continue;

                    dp[i+k][j+l] = (dp[i+k][j+l] + dp[i][j]) % 10000;

                }

            }

        }

}



int main()

{

    int t,i,j;

    cin >> t;

    while(t--)

    {

        memset(dp,0,sizeof(dp));

        cin >> n >> m;

        for(i=0; i<n; i++)

        {

            for(j=0; j<m; j++)

            {

                scanf("%d",&map[i][j]);

            }

        }

        solve();

        printf("%d\n",dp[n-1][m-1]);

    }

    return 0;

}


 

 

你可能感兴趣的:(HDU)