AcWing 901. 滑雪 (搜索优化为dp)

记忆化搜索——AcWing 901. 滑雪 记忆化搜索是一种结合了搜索和动态规划思想的方法。它通过将已经计算过的结果存储起来,在后续遇到相同情况时直接返回存储的结果,避免重复计算。 阅读详情

给定一个R行C列的矩阵,表示一个矩形网格滑雪场。

矩阵中第 i 行第 j 列的点表示滑雪场的第 i 行第 j 列区域的高度。

一个人从滑雪场中的某个区域内出发,每次可以向上下左右任意一个方向滑动一个单位距离。

当然,一个人能够滑动到某相邻区域的前提是该区域的高度低于自己目前所在区域的高度。

下面给出一个矩阵作为例子:

 1  2  3  4 5

16 17 18 19 6

15 24 25 20 7

14 23 22 21 8

13 12 11 10 9

在给定矩阵中,一条可行的滑行轨迹为24-17-2-1。

在给定矩阵中,最长的滑行轨迹为25-24-23-…-3-2-1,沿途共经过25个区域。

现在给定你一个二维矩阵表示滑雪场各区域的高度,请你找出在该滑雪场中能够完成的最长滑雪轨迹,并输出其长度(可经过最大区域数)。

输入格式

第一行包含两个整数R和C。

接下来R行,每行包含C个整数,表示完整的二维矩阵。

输出格式

输出一个整数,表示可完成的最长滑雪长度。

数据范围

1≤R,C≤3001≤R,C≤300,
0≤矩阵中整数≤100000≤矩阵中整数≤10000

输入样例:

5 5
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9

输出样例:

25

暴力解法会超时。


import java.io.*;
import java.lang.*;

class Main{
    
    static int N = 310, r = 0, c = 0;
    static int[][] t = new int[N][N];
    static int[][] f = new int[N][N];
    static int[] dx = {-1, 1, 0, 0}, dy = {0, 0, -1, 1};
    static int res = 0;
    static void dfs(int a, int b, ine len){
        if(res < len)res = len;
        for(int i = 0; i < 4; ++i){
            int x = a + dx[i], y = b + dy[i];
            if(x >= 1 && x <= r && y >= 1 && y <= c && t[a][b] > t[x][y]){
                dfs(x, y, len - 1);
            }
        }
    }
    
    public static void main(String[] args)throws Exception{
        BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));
        String[] params = buf.readLine().split(" ");
        r = Integer.valueOf(params[0]);
        c = Integer.valueOf(params[1]);
        
        for(int i = 1; i <= r; ++ i){
            String[] info = buf.readLine().split(" ");
            for(int j = 1; j <= c; ++ j){
                t[i][j] = Integer.valueOf(info[j - 1]);
            }
        }
        for(int i = 1; i <= r; ++ i){
            for(int j = 1; j <= c; ++j){
                dfs(i, j, 0);
            }
        }
        System.out.print(res);
        
    }
}

dp优化算法


import java.io.*;
import java.lang.*;

class Main{
    
    static int N = 310, r = 0, c = 0;
    static int[][] t = new int[N][N];
    static int[][] f = new int[N][N];
    static int[] dx = {-1, 1, 0, 0}, dy = {0, 0, -1, 1};
    static int dp(int a, int b){
        if(f[a][b] != 0)return f[a][b];
        f[a][b] = 1;
        
        for(int i = 0; i < 4; ++i){
            int x = a + dx[i], y = b + dy[i];
            if(x >= 1 && x <= r && y >= 1 && y <= c && t[a][b] > t[x][y]){
                f[a][b] = Math.max(f[a][b], dp(x, y) + 1);
            }
        }
        return f[a][b];
    }
    
    public static void main(String[] args)throws Exception{
        BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));
        String[] params = buf.readLine().split(" ");
        r = Integer.valueOf(params[0]);
        c = Integer.valueOf(params[1]);
        
        for(int i = 1; i <= r; ++ i){
            String[] info = buf.readLine().split(" ");
            for(int j = 1; j <= c; ++ j){
                t[i][j] = Integer.valueOf(info[j - 1]);
            }
        }
        int res = 0;
        for(int i = 1; i <= r; ++ i){
            for(int j = 1; j <= c; ++j){
                res = Math.max(res, dp(i, j));
            }
        }
        System.out.print(res);
        
    }
}
题解:AcWing 901 滑雪 题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。现在给定你一个二维矩阵表示滑雪场各区域的高度,请你找出在该滑雪场中能够完成的最长滑雪轨迹,并输出其长度(可经过最大区域数)。一个人从滑雪场中的某个区域内出发,每次可以向上下左右任意一个方向滑动一个单位距离。当然,一个人能够滑动到某相邻区域的前提是该区域的高度低于自己目前所在区域的高度。输出一个整数,表示可完成的最长滑雪长度。列的矩阵,表示一个矩形网格滑雪场。个整数,表示完整的二维矩阵。 阅读详情

相关推荐

别再拿空气标定法糊弄了!手把手教你搞定水下相机标定(附Python代码)

本文详细解析水下相机标定的关键技术,揭示传统空气标定法失效原因,并提供基于单视点模型(SVP)的完整Python解决方案。通过折射效应分析、标定板设计优化和代码实战演示,帮助读者掌握水下标定核心方法,有效提升水下视觉系统测量精度。

weixin_30530939的博客 209

AcWing1015摘花生问题dpJava版

【代码】AcWing1015摘花生问题dpJava版。

2302_76649176的博客 522

树莓派使用 OLED 屏显示图片及文字

树莓派默认是不带显示屏的,如果想要查看系统的一些信息,需要使用电脑登录到树莓派,或者通过 HDMI 连接外接显示器查看。这样做总是有点麻烦,我们可以通过外接一个 OLED 屏来显示一些关键参数或者图片。本文将详细介绍操作方法。 OLED 模组介绍 OLED 屏主要有两种:128×32 和 128×64 ,主要颜色是白、黄、蓝。OLED 屏的特点是功耗低,价格便宜,使用 I2C 接口与主机连接。本文所使用的是 128×64 尺寸的屏幕,外形如下: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直

码到成功 3743

1015. 摘花生

Hello Kitty想摘点花生送给她喜欢的米老鼠。 她来到一片有网格状道路的矩形花生地(如下图),从西北角进去,东南角出来。 地里每个道路的交叉点上都有种着一株花生苗,上面有若干颗花生,经过一株花生苗就能摘走该它上面所有的花生。 Hello Kitty只能向东或向南走,不能向西或向北走。 问Hello Kitty最多能够摘到多少颗花生。 输入格式 第一行是一个整数T,代表一共有多...

Windsearcher的博客 1093

我的AI学习 ai维护工具之langfuse

as_type: Optional[Literal[‘generation’]] = None, # 将记录定义为 Observation (LLM 调用)transform_to_string: Optional[Callable[[Iterable], str]] = None # 将输出转为 string。要用LangFuse的云服务,首先要在LangFuse官网上注册,注册完后将页面拉倒最后,点免费的SignUp,API文档:https://api.reference.langfuse.com/

liubaobin的博客 4095

DPABINet保姆级教程:零代码完成脑网络分析与图论计算

本文提供DPABINet的零代码脑网络分析全流程指南。该工具通过图形化界面集成时间序列提取、连接矩阵构建、图论指标计算及统计分析,大幅降低技术门槛。重点解析了阈值选择、二值化与小世界属性计算等关键步骤,帮助研究者快速掌握脑网络分析与图论计算,提升科研效率与可重复性。

j2k3l4的博客 669

Acwing---1015. 摘花生 (Java)_经典DP题型

摘花生 ①. 题目②. 思路③. 学习点④. 代码实现 原题链接 ①. 题目 ②. 思路 到达终点也就是两个位置过来,可以从后面开始递推,比较从左边过来和从上面过来的最大值再加上终点这个值,直接推出动态转移方程dp[i][j]=Math.max(dp[i-1][j], dp[i][j-1])+g[i][j] ③. 学习点 DP递推 ④. 代码实现 import java.io.*; public class _1015_摘花生_dp { public static void main

375

STM32F4XX软件模拟I2C实现MPU6050姿态数据采集

本文详细介绍了在STM32F4XX平台上通过软件模拟I2C驱动MPU6050传感器实现姿态数据采集的完整方案。内容涵盖软件I2C的GPIO配置、核心通信函数实现、MPU6050寄存器配置详解以及数据读取处理流程,为硬件资源受限的嵌入式应用提供了灵活的解决方案,并分享了调试技巧与常见问题处理方法。

butter的博客 678

AcWing 1015. 摘花生

Hello Kitty想摘点花生送给她喜欢的米老鼠。 她来到一片有网格状道路的矩形花生地(如下图),从西北角进去,东南角出来。 地里每个道路的交叉点上都有种着一株花生苗,上面有若干颗花生,经过一株花生苗就能摘走该它上面所有的花生。 Hello Kitty只能向东或向南走,不能向西或向北走。 问Hello Kitty最多能够摘到多少颗花生。 1.gif 输入格式 第一行是一个整数T,代表一共有多少组...

Allen的博客 430

【unity实战】Unity手搓脚本工具实现合并网格功能

本文介绍了在Unity中优化网格性能的方法,通过合并重复网格减少绘制调用。主要使用Mesh.CombineMeshes方法实现网格合并,支持统一材质和多材质处理。核心内容包括:1)基础合并脚本实现,将子网格合并到父对象并禁用原网格;2)统一材质设置,支持自定义或默认材质;3)多材质合并方案,通过设置mergeSubMeshes=false保留子网格材质索引。文章还提供了完整代码示例和操作演示,适用于实际项目中的网格优化需求。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 560

多模型机器学习生存预测分析:AUC比较、生存分层与SHAP解释

本文研究了多种机器学习模型在心力衰竭患者生存预测中的应用。通过比较逻辑回归、随机森林、XGBoost、LightGBM和梯度提升机五种模型的AUC表现,选择最优预测模型。基于最优模型的预测概率对患者进行风险分层,并使用Kaplan-Meier生存分析和log-rank检验验证分层的有效性。最后采用SHAP方法解释模型决策过程,识别关键预测因素。研究提供了从模型构建、评估到解释的完整技术流程,为临床预后预测提供了可复现的分析框架。

AI的内部世界的博客 157

AcWing 1015. 摘花生 (DP)

1015. 摘花生 思路 状态表示:dp[i][j]表示从(1, 1)走到(i, j)的所有路线中权值最大的那条路线 状态计算(集合划分):从(1, 1)走到(i, j)的所有路线集合划分为下面两类 最后一步走到(i, j)时,是从上往下走的 最后一步走到(i, j)时,是从左往右走的 状态转移方程:dp[i][j] = max(dp[i - 1][j] + w[i][j], dp[i][j - 1] + w[i][j]) ans = dp[r][c] import java.util.*; im

k909397116的博客 201

软考高级系统架构设计师系列论文四十九:论微服务架构及其应用

软考高级系统架构设计师系列论文四十九:论微服务架构及其应用

zhengzaifeidelushang的博客 3194

Acwing_901滑雪【记忆化搜索】

题目链接:Acwing_901滑雪

DJL新时代农民工DJL 189

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

acwing901 poj1088 滑雪

给定一个R行C列的矩阵,表示一个矩形网格滑雪场。 矩阵中第 i 行第 j 列的点表示滑雪场的第 i 行第 j 列区域的高度。 一个人从滑雪场中的某个区域内出发,每次可以向上下左右任意一个方向滑动一个单位距离。 当然,一个人能够滑动到某相邻区域的前提是该区域的高度低于自己目前所在区域的高度。 下面给出一个矩阵作为例子: 1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9 在给定矩阵中,一条可行的滑行轨迹为24-17-2-1。

BOWWOB的博客 254

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

AcWing 901. 滑雪

题目 给定一个R行C列的矩阵,表示一个矩形网格滑雪场。 矩阵中第 i 行第 j 列的点表示滑雪场的第 i 行第 j 列区域的高度。 一个人从滑雪场中的某个区域内出发,每次可以向上下左右任意一个方向滑动一个单位距离。 当然,一个人能够滑动到某相邻区域的前提是该区域的高度低于自己目前所在区域的高度。 下面给出一个矩阵作为例子: 1 2 3 4 5 16 17 18 19 6 15 24 25 2...

萌新的博客 236

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

[AcWing] 901. 滑雪(C++实现)记忆化搜索例题

[AcWing] 901. 滑雪(C++实现)记忆化搜索例题1. 题目2. 读题(需要重点注意的东西)3. 解法4. 可能有帮助的前置习题5. 所用到的数据结构与算法思想6. 总结 1. 题目 2. 读题(需要重点注意的东西) 思路: 一句话思路:考虑从四个方向滑过来的最大值,那么当前值f(x,y)就等于四个方向滑过来的最大值+1。 将四个方向滑过来的最大值记为f(a,b),则f(x,y) = f(a,b)+1,再一步步递归进去回溯出答案。 代码实现思路: 3. 解法 ----------------

cloud的博客 1374

AcWIng 901 滑雪 记忆化搜索

给定一个 R 行 C 列的矩阵,表示一个矩形网格滑雪场。矩阵中第 i 行第 j 列的点表示滑雪场的第 i 行第 j 列区域的高度。一个人从滑雪场中的某个区域内出发,每次可以向上下左右任意一个方向滑动一个单位距离。当然,一个人能够滑动到某相邻区域的前提是该区域的高度低于自己目前所在区域的高度。在给定矩阵中,一条可行的滑行轨迹为 24−17−2−1。在给定矩阵中,最长的滑行轨迹为 25−24−23−…−3−2−1,沿途共经过 25 个区域。

shadow2kkkk的博客 468

记忆化搜索

文章目录前言一、动态规划二、AcWing 901. 滑雪本题解析AC代码三、时间复杂度 前言 复习acwing算法基础课的内容,本篇为讲解基础算法:动态规划——记忆化搜索,关于时间复杂度:目前博主不太会计算,先鸽了,日后一定补上。 一、动态规划 动态规划(Dynamic Programming,DP)是求解决策过程最优化的过程,个人认为是目前接触的所有算法里最绕的… 这里的题目的解题方法来自于:y总的闫氏dp分析法 二、AcWing 901. 滑雪 本题链接:AcWing 901. 滑雪 本博客提供.

佛系更新 779

(dp+记忆化) acwing 901. 滑雪

901. 滑雪 题目链接https://www.acwing.com/problem/content/903/ 题目: #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; int n,m; int a[310][310]; int f[310][310]; int fx[4][2]={{-1,0},{1,0},{0,1

记录一些刷过的题并分享学习心得 291

【Acwing901】滑雪(记忆化搜索)题目讲解

本文章讲解acwing算法基础课的题目“滑雪”

亿维数组's博客 360

Acwing 901. 滑雪(记忆化搜索)

记忆化搜索模板题目。 题目求的是最长的一条滑雪的路径。 动态规划分析如下: #include <iostream> #include <cstring> #include <algorithm> using namespace std; const int N = 310; int n , m; int h[N][N]; int f[N][N]; int dx[4] = {-1 , 0 , 1 , 0} , dy[4] = {0 , 1 , 0 , -1};..

qq_45260619的博客 293

AcWing记忆化搜索--滑雪

本文介绍了使用记忆化搜索解决滑雪路径最大长度问题。通过递归方式实现动态规划,记录已计算的子问题结果以避免重复计算。算法定义f[i][j]表示从(i,j)开始滑的最大轨迹长度,初始值为1。遍历四个方向,当相邻点高度较低时递归求解并更新最大值。最终在所有起点中取最大值作为结果。代码实现了该算法,使用二维数组存储高度和中间结果,通过递归函数dp完成计算。

qq_73614572的博客 166

数据结构与算法学习笔记----记忆化搜索

@ author: 明月清了个风ps⭐️记忆化搜索其实是一种优化递归算法的方法,通过存储已计算的结果来避免重复计算,显著提升效率。

weixin_60278491的博客 1123

数位DP、状压DP、树形DP、记忆化搜索

可以用 i - (1<<j)求出上一个点数的 状态,用if(i >> j & 1)判断这个状态是否包含该点。下次求某个被算过的位置的状态时,无需重新计算,直接返回。如果只是采用 dfs 暴搜的话,每次在一个位置搜索完之后,状态都不会被保留,下次 dfs 还是重新开始,就会有很多被算过的位置再重新计算。记忆化搜索就是 dfs + 记忆化数组f[i][j],在算某一个位置时把它的所有路径上 所有算过的位置状态保存在数组f[i][j]里。求某个节点的状态时需要先递归的求出每个子树的大小(树的重心)

2201_75435092的博客 551

ACM - DP - 基础(背包 + 线性 + 区间 + 计数类 + 数位 + 状压 + 树形 + 记忆化搜索)

动态规划AcWing 基础课1、背包问题01背包 : 每件物品最多只能选一次完全背包 : 每件物品可以选任意次多重背包(朴素版):限定每件物品选择次数的上限多重背包(二进制优化版):限定每件物品选择次数的上限,但是上限较大分组背包:分为 x 组,每一组最多只能选择其中的一件2、线性 DPAcWing 898. 数字三角形AcWing 895. 最长上升子序列AcWing 896. 最长上升子序列 II(n = 10^5 nlogn的做法)AcWing 897. 最长公共子序列AcWing 902. 最短

优快云Wudanna的博客 799
上一篇: AcWing 285. 没有上司的舞会(树形DP)
下一篇: AcWing 905. 区间选点(贪心:区合合并的变形)
AARM
博客等级 码龄10年 10粉丝 116原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值