题目链接: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