POJ 1088 滑雪 动态规划

本文介绍了一种使用递归方法解决从特定起点出发,在满足条件的情况下,寻找最长路径的问题。通过定义状态f[i][j]来记录从位置(i, j)开始能够达到的最大步数,并采用递归函数work(i, j)来实现对每个位置的最大步数的计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


  题意:从一个数开始,可以往上下左右四个方向走,要求走到的的数比当前的数小,这条路最多能经过多少个数。
  设f[i][j]表示以编号a[i][j]这个格子为起点,所能走的步数,那么显然有f[i][j] = f[i - 1][j] 、f[i + 1][j] 、f[i][j - 1] 、f[i][j + 1]这四个数里面较大的一个再加上1(当然还要考虑能否到达的情况)。
  那么问题来了:挖掘机技术哪家强应该怎么来确定枚举顺序呢?
  在之前的一些题目里,题目是有明显的递推先后顺序的,然而这一题似乎不太明显。当前格子的步数取决于旁边格子的步数,旁边格子的步数又取决于旁边的旁边的格子的步数,而且它们还会互相影响。那该怎么办呢?看看递推式,想要确定f[i][j],必须先确定它旁边能到达的格子的f值,这其实就是一个递归的过程。用一个函数work(i, j)来求[i, j]格子的值, 那么work(i, j)首先检查f[i][j]是否已经求出来了,如果没有,它就去递归地求[i, j]格子旁边能到达的格子的值(这个递归一定会停下来的,因为总能找到一个格子,它周围的数都比它大。注意处理边界情况!),然后更新并返回f[i][j]的值,否则直接返回f[i][j]。这样对所有格子处理一遍就好了。当然,如果当前处理到的格子已经求出了f[i][j],就没必要再调用work了。
#include <iostream>
#include <cmath>
#include <cstdio>
#include <vector>
#include <set>
#include <cstring>
#include <climits>
#include <map>
#include <string>
#include <algorithm>
#include <queue>

using namespace std;

int c, r, height[102][102], f[102][102];
bool vis[102][102];
const int movex[] = { -1, 0, 1, 0};
const int movey[] = {0, 1, 0, -1};

int work(int x, int y);

int main() {
  cin >> r >> c;
  for (int i = 1; i <= r; ++i) {
    for (int j = 1; j <= c; ++j) {
      cin >> height[i][j];
    }
  }
  int ans = 0;
  for (int i = 1; i <= r; ++i) {
    for (int j = 1; j <= c; ++j) {
      if (!f[i][j])
        f[i][j] = work(i, j);
      ans = max(ans, f[i][j]);
    }
  }
  cout << ans + 1<< endl;
  return 0;
}

int work(int x, int y) {
  if (!f[x][y]) {
    int newx, newy;
    for (int i = 0; i < 4; ++i) {
      for (int j = 0; j < 4; ++j) {
        newx = x + movex[i];
        newy = y + movey[i];
        if (newx >= 1 && newx <= r && newy >= 1 && newy <= c
            && height[x][y] > height[newx][newy])
          f[x][y] = max(f[x][y], work(newx, newy) + 1);
      }
    }
  }
  return f[x][y];
}
  最后输出+1,是因为我的f[i][j]代表的是走了多少步,还要加上起点才是正确答案。


基于Spring Boot搭建的一个多功能在线学习系统的实现细节。系统分为管理员和用户两个主要模块。管理员负责视频、文件和文章资料的管理以及系统运营维护;用户则可以进行视频播放、资料下载、参与学习论坛并享受个性化学习服务。文中重点探讨了文件下载的安全性和性能优化(如使用Resource对象避免内存溢出),积分排行榜的高效实现(采用Redis Sorted Set结构),敏感词过滤机制(利用DFA算法构建内存过滤树)以及视频播放的浏览器兼容性解决方案(通过FFmpeg调整MOOV原子位置)。此外,还提到了权限管理方面自定义动态加载器的应用,提高了系统的灵活性和易用性。 适合人群:对Spring Boot有一定了解,希望深入理解其实际应用的技术人员,尤其是从事在线教育平台开发的相关从业者。 使用场景及目标:适用于需要快速搭建稳定高效的在线学习平台的企业或团队。目标在于提供一套完整的解决方案,涵盖从资源管理到用户体验优化等多个方面,帮助开发者更好地理解和掌握Spring Boot框架的实际运用技巧。 其他说明:文中不仅提供了具体的代码示例和技术思路,还分享了许多实践经验教训,对于提高项目质量有着重要的指导意义。同时强调了安全性、性能优化等方面的重要性,确保系统能够应对大规模用户的并发访问需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值