poj1088_dfs+记忆化

这个滑雪题做的很恼火呀,TLE了无数,WA了无数。一开始以为要找从最大值到最小值的最大长度,也没有记忆搜索过的点,TLE了。然后发现不对,改成了矩阵中的点到最小值的最大长度,又WA了。最后看了disscuss 中的测试数据,发现自己好sb啊。题目根本没有要求最大值最小值一说,只求的是最大长度,怒!!!

还有自己搜索题写的很一般啊,不是,是相当次,必须得强加训练。

这道题的题意就像上边所说,求矩阵中从某点开始到某点结束的最大长度,读题要认真啊。

分析:dfs+记忆化搜索,没有记忆之前的节点的话,会超时哦。

代码:

View Code
 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <memory.h>
 4 using namespace std;
 5 
 6 const int maxnum=101;
 7 int array[maxnum][maxnum];
 8 int res[maxnum][maxnum];
 9 int r,c;
10 int lx[4]={-1,1,0,0};
11 int ly[4]={0,0,-1,1};
12 
13 bool judge(int x,int y)
14 {
15     if(x>=1 && x<=r && y>=1 && y<=c)
16         return true;
17     else return false;
18 }
19 
20 int dfs(int x,int y)
21 {
22     if(res[x][y]!=0) return res[x][y];
23     int i;
24     int big=0;
25     for(i=0;i<4;i++)
26         if(judge(x+lx[i],y+ly[i]) && array[x+lx[i]][y+ly[i]]<array[x][y])
27         {
28             res[x+lx[i]][y+ly[i]]=dfs(x+lx[i],y+ly[i]);
29             if(big<res[x+lx[i]][y+ly[i]])
30                 big=res[x+lx[i]][y+ly[i]];
31         }
32     if(big>0) return big+1;
33     return 1;   //big==0 表示走到死胡同里了。
34     //return 0 表示各个点中到最小点的距离。
35 }
36 
37 int main()
38 {
39     scanf("%d%d",&r,&c);
40     int i,j;
41     int small,si,sj;
42     small=10005;
43     memset(res,0,sizeof(res));
44     memset(array,0,sizeof(array));
45     for(i=1;i<=r;i++)
46         for(j=1;j<=c;j++)
47         {
48             scanf("%d",&array[i][j]);
49             if(array[i][j]<small)
50             {
51                 small=array[i][j];
52                 si=i;
53                 sj=j;
54             }
55         }
56 
57     res[si][sj]=1;
58     for(i=1;i<=r;i++)
59         for(j=1;j<=c;j++)
60             res[i][j]=dfs(i,j);
61 
62     int ans=0;
63     for(i=1;i<=r;i++)
64         for(j=1;j<=c;j++)
65             if(res[i][j]>ans)
66                 ans=res[i][j];
67     printf("%d\n",ans);
68     return 0;
69 }

 

 

posted @ 2012-07-22 10:00  pushing my way  阅读(625)  评论(0编辑  收藏  举报