您的位置:首页 > 其它

记忆化搜索_POJ1088(滑雪)

2016-07-15 16:20 381 查看
题目链接: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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: