记忆化搜索: 滑雪
C++
滑雪
/* 问题描述: 给定一个 R 行 C 列的矩阵,表示一个矩形网格滑雪场。 矩阵中第 i 行第 j 列的点表示滑雪场的第 i 行第 j 列区域的高度。 一个人从滑雪场中的某个区域内出发,每次可以向上下左右任意一个方向滑动一个单位距离。 当然,一个人能够滑动到某相邻区域的前提是该区域的高度低于自己目前所在区域的高度。 现在给定你一个二维矩阵表示滑雪场各区域的高度,请你找出在该滑雪场中能够完成的最长滑雪轨迹,并输出其长度(可经过最大区域数)。 第一行包含两个整数 R 和 C。 接下来 R 行,每行包含 C 个整数,表示完整的二维矩阵。 输出一个整数,表示可完成的最长滑雪长度。 数据范围: 1 ≤ R, C ≤ 300 , 0 ≤ 矩阵中整数 ≤ 10000 解题思路: f[i][j] 表示从 i, j 出发,滑行的最大长度 这是一个递归的过程, (i, j) 相邻的位置,高于 h[i][j] 无法被自己更新,低于 f[i][j] 的需要让他先走,先计算出他的 f */ #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using namespace std; const int N = 310; int f[N][N], h[N][N]; int n, m; int dx[4] = {1, 0, -1, 0}; int dy[4] = {0, 1, 0, -1}; bool check(int x, int y) { return x >= 1 && x <= n && y >= 1 && y <= m; } void dfs(int cx, int cy) { int nx, ny; f[cx][cy] = 1; // 记得这里需要初始化 for (int i = 0; i < 4; i ++ ) { nx = cx + dx[i]; ny = cy + dy[i]; if (check(nx, ny) && h[cx][cy] > h[nx][ny]) { if (f[nx][ny] == -1) { dfs(nx, ny); } f[cx][cy] = max(f[nx][ny] + 1, f[cx][cy]); } } } int solution() { int res = 1; memset(f, -1, sizeof f); for (int i = 1; i <= n; i ++ ) { for (int j = 1; j <= m; j ++ ) { if (f[i][j] == -1) { dfs(i, j); } res = max(res, f[i][j]); } } return res; } int main() { scanf("%d%d", &n, &m); for (int i = 1; i <= n; i ++ ) { for (int j = 1; j <= m; j ++ ) { scanf("%d", &h[i][j]); } } int res = solution(); printf("%d\n", res); return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)