标签:
http://poj.org/problem?id=1088
一道中文题,这道题如果不限时的话,是个简单的搜索,但限时的话,就要用记忆化搜索
所谓记忆化搜索就是对每一次搜索的结果进行记录,然后之后的如果需要使用到这次搜索的结果的话,就可以直接使用,不需要再去搜索,可以减少很多时间
1 #include <stdio.h> 2 #include <iostream> 3 #include <string.h> 4 5 using namespace std; 6 int cub[104][104]; 7 bool jud[104][104]; 8 int dis[104][104]; 9 10 int m,n,max1,x,y,ans; 11 12 int dfs(int i,int j){ 13 if(cub[i-1][j]<cub[i][j]){ 14 if(!jud[i-1][j]) { //这个就是我的记忆化搜索,把以前搜索到的结果,直接使用就可以。 15 ans+=dis[i-1][j]; 16 if(ans>dis[x][y]) dis[x][y]=ans; 17 ans-=dis[i-1][j]; 18 } 19 else { 20 ans++; 21 dfs(i-1,j); 22 if(ans>dis[x][y]) dis[x][y]=ans; 23 ans--; 24 } 25 } 26 if(cub[i+1][j]<cub[i][j]){ 27 if(!jud[i+1][j]) { 28 ans+=dis[i+1][j]; 29 if(ans>dis[x][y]) dis[x][y]=ans; 30 ans-=dis[i+1][j]; 31 } 32 else { 33 ans++; 34 dfs(i+1,j); 35 if(ans>dis[x][y]) dis[x][y]=ans; 36 ans--; 37 } 38 } 39 if(cub[i][j-1]<cub[i][j]){ 40 if(!jud[i][j-1]) { 41 ans+=dis[i][j-1]; 42 if(ans>dis[x][y]) dis[x][y]=ans; 43 ans-=dis[i][j-1]; 44 } 45 else { 46 ans++; 47 dfs(i,j-1); 48 if(ans>dis[x][y]) dis[x][y]=ans; 49 ans--; 50 51 } 52 } 53 if(cub[i][j+1]<cub[i][j]){ 54 if(!jud[i][j+1]) { 55 ans+=dis[i][j+1]; 56 if(ans>dis[x][y]) dis[x][y]=ans; 57 ans-=dis[i][j+1]; 58 } 59 else { 60 ans++; 61 dfs(i,j+1); 62 if(ans>dis[x][y]) dis[x][y]=ans; 63 ans--; 64 65 } 66 } 67 jud[x][y]=false; //每一个搜索后,对那个那个搜索后的点进行标记 68 return 0; 69 } 70 int main(){ 71 scanf("%d%d",&m,&n); 72 memset(dis,0,sizeof(dis)); 73 memset(jud,false,sizeof(jud)); 74 memset(cub,1,sizeof(cub)); //初始化1的目的就是边界。把那些边界的值都赋值为很大。memset赋值1的话,cub里面的数不是1. 75 max1=0; 76 for(int i=1;i<=m;i++) 77 for(int j=1;j<=n;j++){ 78 scanf("%d",&cub[i][j]); 79 dis[i][j]=1; 80 jud[i][j]=true; 81 } 82 for(x=1;x<=m;x++) 83 for(y=1;y<=n;y++){ 84 ans=1; 85 dfs(x,y); 86 if(max1<dis[x][y]) max1=dis[x][y]; 87 } 88 printf("%d\n",max1); 89 return 0; 90 }
标签:
原文地址:http://www.cnblogs.com/Tree-dream/p/5700361.html