Shirlies
宁静专注认真的程序媛~

搞了点搜索,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 }
posted on 2012-08-14 19:42  Shirlies  阅读(268)  评论(0编辑  收藏  举报