HDU1978

//记忆化搜索
//从左上角走到右下角,每次只能往右走和往下走
//每个格子有一个数表示在次处能继续走的步子,问从终点到起点有多少种走法
//dp[i][j]表示走到i,j处有多少种走法
//开始时先标记dp[n][m]=1,表示走到终点有一种走法,然后就开始记忆化搜索= =,详细看代码

#include <iostream>

#include <string.h>

using namespace std;

int map[105][105];

int dp[105][105];

int n,m;

bool check(int x,int y)

{

    if(x>=1&&x<=n&&y>=1&&y<=m)

        return true;

    else

        return false;

}



int dfs(int x,int y)

{

    if(dp[x][y]>=0)

        return dp[x][y];

    dp[x][y]=0;

    for(int i=0;i<=map[x][y];i++)

        for(int j=0;j<=map[x][y]-i;j++)

        {

            if(!check(x+i,y+j))//注意是越界了才continue= =

                break;

            else

                dp[x][y]=(dp[x][y]+dfs(x+i,y+j))%10000;

        }

    return dp[x][y];

}



int main()

{

    int t;

    cin>>t;

    while(t--)

    {



        cin>>n>>m;

        for(int i=1;i<=n;i++)

            for(int j=1;j<=m;j++)

                cin>>map[i][j];



        memset(dp,-1,sizeof(dp));//先memset再赋值= =

        dp[n][m]=1;

        printf("%d\n",dfs(1,1));

    }

    return 0;

}



 

你可能感兴趣的:(HDU)