题意:只能向右或向下走,从左上角成功走到右下角,次数加1,每走一步能量减一,每次目标点数字为下一次移动的能量。
算法:记忆化DFS算法
问题:循环条件写错,应该把判断条件写在循环里,加continue,而不是写在总条件里;记忆化是存数组,而不是把函数递归,所有是sum[i][j]=sum[i][j]+dfs(…)
思路:将最后一次DFS算出的+1的结果存在数组里,逐步往前送,送到Sum[1][1],输出
代码:ac
#include<bits/stdc++.h>
using namespace std;
int Map[105][105];
int Sum[105][105];
int t, m, n;
int si, sj;
int dfs(int si, int sj);
int main()
{
scanf("%d", &t);
while (t--)
{
memset(Sum,0,sizeof(Sum));
scanf("%d%d", &n, &m);
for(int i=1;i<=n;i++)
for (int j=1; j <= m; j++)
scanf("%d", &Map[i][j]);
si = 1; sj = 1;
printf("%d\n", dfs(1, 1)%10000);
}
return 0;
}
int dfs(int si, int sj)
{
if (Sum[si][sj])return Sum[si][sj];
int step = Map[si][sj];
if (si == n && sj == m) {
Sum[si][sj]=1; return 1;
}
int i, j;
for (i = 0;i <= step; i++)
for (j = 0; i + j <= step; j++)
{
if (i + j == 0)continue;
if (si+i<=n&&sj+j<=m) {
Sum[si][sj]=(Sum[si][sj]+dfs(si + i, sj + j))%10000;/*将该点后续情况数存放在数组里*/
}
}
return Sum[si][sj];
}