/*
记忆型DP,或者搜索
每个点可选的路径有限--最多4个, 计算出从周边点出发所能取得的最长路径 + 1即是从该点出发
所能获得的最长路径值.
记忆表采用与点存储表相同的存储格式 -- 一一对应。
*/
#include <iostream>
#include <algorithm>
namespace {
using namespace std;
const int R_MAX = 100;
const int C_MAX = 100;
const int H_MAX = 10000;
int height[R_MAX][C_MAX];
int length[R_MAX][C_MAX];
int dx[] = {-1, 0, 1, 0}, dy[]={0, -1, 0, 1};
int r, c;
inline bool onboard(int x, int y)
{
return (0<=x && x<r) && (0<=y && y<c);
}
/*
求坐标x y处起始的最长距离
函数的副作用: 记录查询表
*/
int max_length(int x, int y)
{
if (length[x][y] != 0) return length[x][y];
int l = 1;
for (int i=0; i<4; i++)
{
int sx = x + dx[i];
int sy = y + dy[i];
if (!onboard(sx, sy)) continue;
if (height[x][y] <= height[sx][sy]) continue;
l = max(max_length(sx, sy)+1, l);
}
length[x][y] = l;
return l;
}
int get_max_length()
{
int l = 0;
for (int i=0; i<r; i++)
{
for (int j=0; j<c; j++)
{
l = max(l, max_length(i, j));
}
}
return l;
}
}
int main()
{
cin >> r >> c;
for (int i=0; i<r; i++)
{
for (int j=0; j<c; j++)
{
cin >> height[i][j];
}
}
cout << get_max_length() << endl;
return 0;
}
poj 1088 滑雪
最新推荐文章于 2021-05-14 11:17:18 发布