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