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 }
朋友们,无论这个世界变得怎样,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。