HDU1978How Many Ways 记忆化dfs+dp

 1 /*记忆化dfs+dp
 2 dp[i][j]代表达到这个点的所有路的条数,那么所有到达终点的路的总数就是这dp[1][1]加上所有他所能到达的点的
 3 所有路的总数
 4 */
 5 
 6 #include<stdio.h>
 7 #include<string.h>
 8 #include<algorithm>
 9 using namespace std;
10 const int maxn=110;
11 int map[maxn][maxn],vis[maxn][maxn];
12 int dp[maxn][maxn];
13 int n,m;
14 int ok(int x,int y)
15 {
16     if(x>=1 && x<=n && y>=1 && y<=m) return 1;
17     return 0;
18 }
19 void init()
20 {
21     memset(dp,0,sizeof(dp));
22     memset(vis,0,sizeof(vis));
23 }
24 int dfs(int x,int y)
25 {
26     if(dp[x][y]) return dp[x][y];
27     if(x==n && y==m) return dp[x][y]=1;
28     int i,j;
29     int num=map[x][y];
30     for(i=0;i<=num;i++)
31     for(j=0;j<=num-i;j++)
32     {
33         int nx=x+i;
34         int ny=y+j;
35         if(ok(nx,ny) && !vis[nx][ny])
36         {
37             vis[nx][ny]=1;
38             dp[x][y]=(dp[x][y]+dfs(nx,ny))%10000;
39             vis[nx][ny]=0;
40         }
41     }
42     return dp[x][y]%10000;
43 }
44 int main()
45 {
46     int i,j;
47     int t;
48     scanf("%d",&t);
49     while(t--)
50     {
51         scanf("%d%d",&n,&m);
52         for(i=1;i<=n;i++)
53         for(j=1;j<=m;j++)
54         scanf("%d",&map[i][j]);
55         init();
56         vis[1][1]=1;
57         int sum=dfs(1,1);
58         printf("%d\n",sum);
59     }
60     return 0;
61 }

 

posted on 2013-08-19 23:59  ok_boy  阅读(219)  评论(0编辑  收藏  举报

导航