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;
}

浙公网安备 33010602011771号