题目链接:http://poj.org/problem?id=1088
如果我们一个一个点去搜的话,肯定会超时,因为有些点会被重复搜索,这样就很浪费时间,所以我们需要用dp来标记一下,因此dp就用来标记当前点的最长距离,如果搜索到的点的dp已经有值了,那么就返回这个dp值直接用就好了(避免重复搜索),因为可以往四个方向去搜,所以用sum来求四个方向的最远距离然后赋值给dp。
AC代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#define maxn 105
using namespace std;
int MAP[maxn][maxn],dp[maxn][maxn];
int dir[4][2] = {1,0,0,1,-1,0,0,-1};
int ans,n,m;
bool Check(int x,int y){
if(x >= 0 && y >= 0 && x < n && y < m)return true;
return false;
}
int dfs(int x,int y){
if(dp[x][y])return dp[x][y];
int sum = 0;
for(int i=0;i<4;i++){
int X = x + dir[i][0];
int Y = y + dir[i][1];
if(Check(X,Y) && MAP[X][Y] > MAP[x][y]){
sum = max(sum,dfs(X, Y));
}
}
dp[x][y] = sum + 1;
return dp[x][y];
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
scanf("%d",&MAP[i][j]);
}
}
memset(dp,0,sizeof(dp));
ans = 0;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
ans = max(ans, dfs(i,j));
}
}
printf("%d\n",ans);
return 0;
}