题意:中文题。。。
记忆化搜索即可,对于点(i, j), dp[i][j] += dp[k][l]; ( 点(k, l) 可到达 ) .不过忘了剪枝。。TLE了两次。。
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn = 111;
const int MOD = 10000;
int n, m, g[maxn][maxn], dp[maxn][maxn];
int dfs(int x, int y)
{
if(dp[x][y]) return dp[x][y] % MOD;
//对搜索范围剪枝
int up = min(n, x+g[x][y]);
int down = min(m, y+g[x][y]);
for(int i=x; i<=up; i++)
for(int j=y; j<=down; j++)
{
if(i == x && j == y) continue;
if(i - x + j - y <= g[x][y]) //曼哈顿距离不超过能量值
{
dp[x][y] += dfs(i, j);
dp[x][y] %= MOD;
}
}
return dp[x][y] % MOD;
}
int main()
{
int t;
scanf("%d", &t);
while(t--)
{
scanf("%d%d", &n, &m);
memset(dp, 0, sizeof(dp));
dp[n][m] = 1;
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
scanf("%d", &g[i][j]);
int ans = dfs(1, 1);
printf("%d\n", ans);
}
return 0;
}