poj1088_dfs+记忆化
这个滑雪题做的很恼火呀,TLE了无数,WA了无数。一开始以为要找从最大值到最小值的最大长度,也没有记忆搜索过的点,TLE了。然后发现不对,改成了矩阵中的点到最小值的最大长度,又WA了。最后看了disscuss 中的测试数据,发现自己好sb啊。题目根本没有要求最大值最小值一说,只求的是最大长度,怒!!!
还有自己搜索题写的很一般啊,不是,是相当次,必须得强加训练。
这道题的题意就像上边所说,求矩阵中从某点开始到某点结束的最大长度,读题要认真啊。
分析:dfs+记忆化搜索,没有记忆之前的节点的话,会超时哦。
代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }