HDU1978How Many Ways 记忆化dfs+dp
来源:互联网 发布:中兴笔试编程题 编辑:程序博客网 时间:2024/06/10 21:30
/*记忆化dfs+dpdp[i][j]代表从这个点出发的所有路的条数,那么所有到达终点的路的总数就是这dp[1][1]加上所有他所能到达的点的所有路的总数*/#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;const int maxn=110;int map[maxn][maxn],vis[maxn][maxn];int dp[maxn][maxn];int n,m;int ok(int x,int y){ if(x>=1 && x<=n && y>=1 && y<=m) return 1; return 0;}void init(){ memset(dp,0,sizeof(dp)); memset(vis,0,sizeof(vis));}int dfs(int x,int y){ if(dp[x][y]) return dp[x][y]; if(x==n && y==m) return dp[x][y]=1; int i,j; int num=map[x][y]; for(i=0;i<=num;i++) for(j=0;j<=num-i;j++) { int nx=x+i; int ny=y+j; if(ok(nx,ny) && !vis[nx][ny]) { vis[nx][ny]=1; dp[x][y]=(dp[x][y]+dfs(nx,ny))%10000; vis[nx][ny]=0; } } return dp[x][y]%10000;}int main(){ int i,j; int 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",&map[i][j]); init(); vis[1][1]=1; int sum=dfs(1,1); printf("%d\n",sum); } return 0;}