题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1978
分析:
递推DP。
dp[][]表示可以到达改点的方法数。
刚开始:
外循环扫描所有点dp[x][y],而内循环扫描出所有可以到达
点x、y的点i、j。
那么dp[x][y]就是所有的dp[i][l]之和。
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
#include <cstdlib>
#include <vector>
#include <set>
#include <map>
#define LL long long
using namespace std;
int dp[][];
int a[][];
int main()
{
int t,n,m;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
scanf("%d",&a[i][j]);
memset(dp,,sizeof(dp));
dp[][]=;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
{
for(int k=;k<=i;k++)
for(int l=;l<=j;l++)
{
if(i-k+j-l<=a[k][l])
{
if(i==k&&j==l)break;
dp[i][j]+=dp[k][l];
}
}
dp[i][j]%=;
}
printf("%d\n",dp[n][m]);
}
}