poj1088(记忆化搜索入门题)

题目链接:http://poj.org/problem?id=1088

思路:

明显的记忆化搜索题,用dp[i][j]表示从(i,j)出发能滑的最远距离,用dfs搜索,若dp[x][y]>0即已经计算过,直接返回值即可,否则按照dfs思路递推计算其最大值,递推式为:

dp[x][y]=max(dp[x][y],dfs(xx,yy)+1)((xx,yy)与(x,y)相邻,且a[xx][yy]<a[x][y])。详见代码:

 1 #include<cstdio>
 2 #include<algorithm>
 3 using namespace std;
 4 
 5 int r,c,res;
 6 int a[105][105],dp[105][105];
 7 int go[4][2]={-1,0,0,1,1,0,0,-1};
 8 
 9 int dfs(int x,int y){
10     if(dp[x][y]>0) return dp[x][y];
11     dp[x][y]=1;
12     for(int i=0;i<4;++i){
13         int xx=x+go[i][0],yy=y+go[i][1];
14         if(xx>=0&&xx<r&&yy>=0&&yy<c&&a[xx][yy]<a[x][y])
15             dp[x][y]=max(dp[x][y],dfs(xx,yy)+1);
16     }
17     return dp[x][y];
18 }
19 
20 int main(){
21     scanf("%d%d",&r,&c);
22     for(int i=0;i<r;++i)
23         for(int j=0;j<c;++j)
24             scanf("%d",&a[i][j]);
25     for(int i=0;i<r;++i)
26         for(int j=0;j<c;++j){
27             int tmp=dfs(i,j);
28             if(tmp>res) res=tmp;
29         }
30     printf("%d\n",res);
31     return 0;            
32 }

 

posted @ 2019-02-26 08:58  Frank__Chen  阅读(414)  评论(0编辑  收藏  举报