题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1978
1 6 6 4 5 6 6 4 3 2 2 3 1 7 2 1 1 4 6 2 7 5 8 4 3 9 5 7 6 6 2 1 5 3 1 1 3 7 2
3948
思路:记忆化搜索~即dp的思想加搜索的形式;
(1)用dp[i][j]表示当前这点(i,j)到终点(n,m)的方法数,通过dfs从顶(1,1)往底(n,m)搜索,然后通过回溯从底(n,m)往顶(1,1)求dp[i][j];
这样可以避免普通反复的搜索
大致就是这么一个思路:
#include <iostream> #include <stdio.h> #include <string.h> #include <string> #include <cstdio> #include <cmath> using namespace std; int map[110][110]; int dp[110][110]; int n,m; int dfs(int x,int y) { if(x==n&&y==m)return 1; //递归出口 if(dp[x][y]>0)return dp[x][y]; //相当于dp优化 int s=0; int cnt=map[x][y]; for(int i=0;i<=cnt;i++) //方向的可行性 for(int j=0;j<=cnt;j++) { if(i+j==0)continue; if(x+i>=1&&x+i<=n&&y+j>=1&&y+j<=m&&i+j<=cnt) { s+=dfs(x+i,y+j); s%=10000; } } dp[x][y]=s; return s%10000; } int main() { int T; cin>>T; while(T--) { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { scanf("%d",&map[i][j]); } memset(dp,0,sizeof(dp)); printf("%d\n",dfs(1,1)); } return 0; }
原文地址:http://blog.csdn.net/liusuangeng/article/details/39120611