首页 > 技术文章 > POJ 1088

Tree-dream 2016-07-24 11:32 原文

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 }

 

推荐阅读