http://acm.hdu.edu.cn/showproblem.php?pid=1978
这题是简单的记忆化搜索 , 用dp[i][j] 表示当前点到终点的方法数,注意要结果要对10000取余就行了。
#include <cstdio>
#include <cstring>
#include <string>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <iostream>
#include <algorithm>
using namespace std;
#define ll long long
#define int64 __int64
#define M 105
int n , m , dp[M][M] , Map[M][M];
int Dfs(int r , int c)
{
if (r >= n || c >= m)return 0;
if (dp[r][c] != -1)return dp[r][c];
if (r == n-1 && c == m-1)return 1;
int i , j , ret = 0;
for (i = 0 ; i <= Map[r][c] ; i++)
for (j = (i == 0 ? 1 : 0) ; j <= Map[r][c]-i ; j++)
ret = (ret+(Dfs(r+i,c+j)%10000))%10000;
return dp[r][c] = ret;
}
int main()
{
int i , j , t;
scanf("%d",&t);
while (t--)
{
memset(dp , -1 , sizeof dp);
scanf("%d%d",&n,&m);
for (i = 0 ; i < n ; i++)
for (j = 0 ; j < m ; j++)
scanf("%d",&Map[i][j]);
printf("%d\n",Dfs(0,0));
}
return 0;
}