您的位置:首页 > 其它

hdu 1978 How many ways(DP)

2014-01-18 15:37 441 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1978

思路:从右到左、从下到上递推。

设dp[i][j]为dp[i0][j0]可达的点,则dp[i0][j0] += dp[i][j];

PS:每个点可达的区域都是一个三角形,如图:

1 #include <cstdio>
2 #include <cstring>
3 #define N 105
4
5 int a

, dp

;
6
7 int main()
8 {
9 int n, m, t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
scanf("%d",&a[i][j]);
memset(dp, 0, sizeof(dp));
dp
[m] = 1;
for(int i=n; i>=1; i--)
{
for(int j=m; j>=1; j--)
{
for(int ii=i; ii<=i+a[i][j] && ii<=n; ii++)
{
for(int jj=j; jj-j+ii-i<=a[i][j] && jj<=m; jj++)
{
if(ii==i && jj==j) continue;
dp[i][j] = (dp[i][j] + dp[ii][jj])%10000;
}
}
}
}
printf("%d\n",dp[1][1]);
}
return 0;
}View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: