HUD 1978——How many ways

来源:互联网 发布:下载站源码 编辑:程序博客网 时间:2024/05/22 13:32

记忆化搜索。

 假设起点变成(n,m),终点变成(1,1)。

dp[i][j]存储到起点该点的路径数。赋值dp[n][m]=1.

从(1,1)往回搜索,一旦遇到dp>0.说明已经被搜索过了,直接返回。

#include<cstdio>#include<iostream>#include<cstring>using namespace std;#define maxn 105#define mod 10000int map[maxn][maxn],dp[maxn][maxn];void DpSet(int n,int m){int i,j;for(i=1;i<=n;i++)for(j=1;j<=m;j++)dp[i][j]=-1;}int dfs(int a,int b,int n,int m){if(dp[a][b]>0)return dp[a][b];int i,j,sum=0;int t;t=map[a][b];for(i=0;i<=t;i++)for(j=0;j<=t;j++)if(i!=0||j!=0)if(i+j<=t&&i+a<=n&&j+b<=m){sum+=dfs(i+a,j+b,n,m);if(sum>9999)sum%=mod;}dp[a][b]=sum;return sum;}int main(){int t,n,m,i,j;scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);DpSet(n,m);for(i=1;i<=n;i++)for(j=1;j<=m;j++)scanf("%d",&map[i][j]);dp[n][m]=1;cout<<dfs(1,1,n,m)<<endl;}return 0;}






原创粉丝点击