题目链接:http://poj.org/problem?id=1088
枚举每一个点 (x, y) ,以该点为起点开始滑,求出最大滑行距离,保留在数组 f[x][y] 中,当再次搜索到该点时直接调用,而不必再次求解。
#include <iostream>
using namespace std;
const int dx[4] = {1,0,-1,0};
const int dy[4] = {0,1,0,-1};
int a[110][110], f[110][110];
int n,m;
int Max, ans;
int dfs(int x, int y)
{
int ans = 0;
if (f[x][y] != 0)
return f[x][y];
for (int i=0; i<4; i++)
{
int xx = x + dx[i];
int yy = y + dy[i];
if (xx < 1 || xx > n || yy < 1 || yy > m || a[xx][yy] >= a[x][y])
continue;
int t = dfs(xx,yy);
ans = max(ans, t);
}
f[x][y] = ans + 1;
return f[x][y];
}
int main()
{
cin>>n>>m;
for (int i=1; i<=n; i++)
for (int j=1; j<=m; j++) cin>>a[i][j];
for (int i=1; i<=n; i++)
{
for (int j=1; j<=m; j++)
{
ans = dfs(i,j);
Max = max(Max, ans);
}
}
cout<<Max<<endl;
return 0;
}