hdu 1978【How many ways】

本文通过动态规划方法解决了一个特定的路径寻找问题。利用二维数组记录到达每个点的方案数,并考虑从当前点可达的其他点,实现了有效的状态转移。最终求得从起点到终点的所有可能路径数量。

搞了点搜索,IDA*那个启发函数太难找了,先放一放,来搞DP,至于DP的题目是根据http://www.cppblog.com/doer-xee/archive/2009/12/05/102629.html这个地方的内容来的,很全面……

这一题还比较好搞……处理当前点,看当前点可达哪一些点……

代码如下:
 1 #include <cstdio>
 2 #include <cstring>
 3 
 4 const int mod = 10000;
 5 int map[105][105];
 6 int dp[105][105];
 7 
 8 int main()
 9 {
10     int n,m;
11     int cas;
12 
13     scanf("%d",&cas);
14     while(cas --)
15     {
16         scanf("%d%d",&n,&m);
17 
18         for(int i = 1;i <= n;i ++)
19         {
20             for(int j = 1;j <= m;j ++)
21             {
22                 scanf("%d",&map[i][j]);
23             }
24         }
25 
26         memset(dp,0,sizeof(dp));
27         dp[1][1] = 1;
28         for(int i = 1;i <= n;i ++)
29         {
30             for(int j = 1;j <= m;j ++)
31             {
32                 //if(i == 1 && j == 1) continue;
33                 for(int k = i;k <= n && k <= i + map[i][j];k ++)
34                 {
35                     for(int t = j;t <= m && t <= j + map[i][j];t ++)
36                     {
37                         if(k == i && t == j) continue;
38                         if(k - i + t - j <= map[i][j])
39                         {
40                             dp[k][t] += dp[i][j];
41                             dp[k][t] %= mod;
42                         }
43                     }
44                 }
45             }
46         }
47 
48         printf("%d\n",dp[n][m] % mod);
49     }
50 
51     return 0;
52 }

转载于:https://www.cnblogs.com/Shirlies/archive/2012/08/14/2638756.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值