题目解析:记忆化搜索:即记录下已经搜索过的点,当再次搜到这个点的时候,直接返回值,不需要再深搜下去(因为此点到终点的方式数已经计算出来了)。
代码如下:
#include<cstdio> #include<cstring> int dp[105][105]; int map[105][105]; int m,n; bool judge(int x,int y) { if(x>=1&&x<=m&&y>=1&&y<=n) return true; return false; } int dfs(int x,int y) { if(dp[x][y]>=0) return dp[x][y]; //说明此点已经搜过,并且到达终点的方式已经记录下来,所以直接返回 else { dp[x][y]=0; //初始值为0 for(int i=0;i<=map[x][y];i++) //确定搜索的范围 for(int j=0;j<=map[x][y]-i;j++) { if(judge(x+i,y+j)) { dp[x][y]=(dp[x][y]+dfs(x+i,y+j))%10000; } } } return dp[x][y]; } int main() { int icase; scanf("%d",&icase); while(icase--) { scanf("%d%d",&m,&n); for(int i=1;i<=m;i++) for(int j=1;j<=n;j++) scanf("%d",&map[i][j]); memset(dp,-1,sizeof(dp)); dp[m][n]=1; //终点的方式是1 dfs(1,1); printf("%d\n",dp[1][1]); } return 0; }