题目链接:hdu1978
/*
记忆化搜索。深搜到终点,回溯时记录到达终点的不同路径数
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int inf = 0x3f3f3f3f;
const int N = 105;
const int mod = 10000;
int a[N][N],d[N][N],n,m;
int dfs(int x, int y)
{
if(d[x][y]) return d[x][y];
if(x == n && y == m) return 1;//到达终点
int cnt = a[x][y], sum = 0;
for(int i = 0; i <= cnt; i ++)
for(int j = 0; j <= cnt; j ++){
if(i+j > 0 && x+i <= n && y+j <= m && i+j <= cnt)
sum += dfs(x+i, y+j);
sum %= mod;
}
d[x][y] = sum;
return sum;
}
int main()
{
int x,i,j,T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
for(i = 1; i <= n; i ++)
for(j = 1; j <= m; j ++)
scanf("%d",&a[i][j]);
memset(d, 0, sizeof(d));
printf("%d\n", dfs(1,1));
}
return 0;
}