博客
关于我
POJ 1088 滑雪
阅读量:793 次
发布时间:2023-03-03

本文共 1792 字,大约阅读时间需要 5 分钟。

为了解决这个问题,我们需要找到一个二维区域内最长的滑雪路径。滑雪的规则是只能向下滑动,且每一步必须是高度递减的。我们可以使用动态规划的方法来解决这个问题。

方法思路

  • 问题分析:我们需要找到从一个点开始,沿着高度递减的方向滑动的最长路径。每个点只能从它周围的更高点滑来。
  • 动态规划:我们可以使用动态规划来记录每个点的最长路径长度。每个点的最长路径长度取决于它周围更高点的最长路径长度加1。
  • 处理顺序:为了确保每个点的周围更高点已经被处理,我们按照高度从大到小的顺序处理每个点。
  • 实现步骤
    • 读取输入数据,存储为二维数组。
    • 创建一个点列表,记录每个点的坐标和高度。
    • 按照高度从大到小排序这些点。
    • 初始化一个动态规划数组,记录每个点的最长路径长度。
    • 遍历排序后的点,检查其周围的四个邻居,如果邻居的高度更低,则更新当前点的最长路径长度。
    • 最后,遍历动态规划数组,找出最大值作为最长路径长度。
  • 解决代码

    #include 
    #include
    #include
    using namespace std;
    int main() {
    int R, C;
    cin >> R >> C;
    vector
    > height(R, vector
    (C, 0)); for (int i = 0; i < R; ++i) { for (int j = 0; j < C; ++j) { int h; cin >> h; height[i][j] = h; } } vector
    > points; for (int i = 0; i < R; ++i) { for (int j = 0; j < C; ++j) { points.emplace_back(height[i][j], i, j); } } sort(points.begin(), points.end(), [](const pair
    & a, const pair
    & b) { return a.first > b.first; }); vector
    > dp(R, vector
    (C, 1)); vector
    > dirs = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}}; for (const auto& p : points) { int h = p.first; int i = p.second.first; int j = p.second.second; for (const auto& dir : dirs) { int ni = i + dir.first; int nj = j + dir.second; if (ni >= 0 && ni < R && nj >= 0 && nj < C) { if (h > height[ni][nj] && dp[ni][nj] + 1 > dp[i][j]) { dp[i][j] = dp[ni][nj] + 1; } } } } int max_length = 1; for (int i = 0; i < R; ++i) { for (int j = 0; j < C; ++j) { if (dp[i][j] > max_length) { max_length = dp[i][j]; } } } cout << max_length << endl; return 0; }

    代码解释

  • 读取输入:首先读取输入数据,存储为二维数组height
  • 创建点列表:将每个点的坐标和高度存储在列表points中。
  • 排序点:按照高度从大到小排序,确保高点先处理。
  • 初始化动态规划数组dp数组记录每个点的最长路径长度,初始值为1。
  • 遍历点:对于每个点,检查其四个邻居,如果邻居的高度更低,则更新当前点的最长路径长度。
  • 找出最大值:遍历dp数组,找出最大值作为最长滑雪路径的长度。
  • 这个方法确保了每个点的最长路径被正确计算,且处理顺序保证了正确性,能够高效解决问题。

    转载地址:http://akxfk.baihongyu.com/

    你可能感兴趣的文章
    POI数据获取及坐标纠偏
    查看>>
    Quartz入门看这一篇文章就够了
    查看>>
    POI解析Excel【poi的坑——空行处理】
    查看>>
    POI:POI+JXL实现xls文件添加水印
    查看>>
    POI:POI实现docx文件添加水印
    查看>>
    POJ 1006
    查看>>
    Quartz中时间表达式的设置-----corn表达式
    查看>>
    poj 1035
    查看>>
    POJ 1061 青蛙的约会 (扩展欧几里得)
    查看>>
    Quartz2.2.1简单使用
    查看>>
    POJ 1080 Human Gene Functions(DP:LCS)
    查看>>
    Quant 开源项目教程
    查看>>
    POJ 1088 滑雪
    查看>>
    POJ 1095 Trees Made to Order
    查看>>
    POJ 1113 Wall(计算几何--凸包的周长)
    查看>>
    poj 1125Stockbroker Grapevine(最短路)
    查看>>