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

原创粉丝点击