跳跃-动态规划问题
跳跃-动态规划问题
- 1、题目描述
- 2、解题思路
- 2.1 解法一:动态规划
- 2.2 解法二:DFS深度优先搜索最大权值
1、题目描述
小蓝在一个 n 行 m 列的方格图中玩一个游戏。
开始时,小蓝站在方格图的左上角,即第 11 行第 11 列。
小蓝可以在方格图上走动,走动时,如果当前在第 r 行第 c* 列,他不能走到行号比 r 小的行,也不能走到列号比 c 小的列。同时,他一步走的直线距离不超过 3。
例如,如果当前小蓝在第 3 行第 5 列,他下一步可以走到第 3 行第 6 列、第 3 行第 7 列、第 3 行第 8 列、第 4 行第 5 列、第 4 行第 6 列、第 4 行第 7 列、第 5 行第 5 列、第 55 行第 6 列、第 6 行第 5 列之一。
小蓝最终要走到第 n 行第 m 列。
在图中,有的位置有奖励,走上去即可获得,有的位置有惩罚,走上去就要接受惩罚。奖励和惩罚最终抽象成一个权值,奖励为正,惩罚为负。
小蓝希望,从第 1 行第 1 列走到第 n 行第 m* 列后,总的权值和最大。请问最大是多少?
输入描述
输入的第一行包含两个整数 n,m,表示图的大小。
接下来 n 行,每行 m* 个整数,表示方格图中每个点的权值。
其中,1≤n≤100,−104≤权值≤1041\le n\le 100,-10^4\le 权值\le10^41≤n≤100,−104≤权值≤104
输出描述
输出一个整数,表示最大权值和。
输入输出样例
示例 1
输入
3 5
-4 -5 -10 -3 1
7 5 -9 3 -10
10 -2 6 -10 -4
输出
15
运行限制
- 最大运行时间:1s
- 最大运行内存: 128M
2、解题思路
2.1 解法一:动态规划
开始的时候我们站在(1,1)(1,1)(1,1)位置,且一步走的直线距离不超过3,如上图所示,假设我们现在开始在(1,1)(1,1)(1,1)位置,那么我们下一步的位置只能是(1,2),(1,3),(1,4),(2,1),(2,2),(2,3),(3,1),(3,2),(4,1)(1,2),(1,3),(1,4),(2,1),(2,2),(2,3),(3,1),(3,2),(4,1)(1,2),(1,3),(1,4),(2,1),(2,2),(2,3),(3,1),(3,2),(4,1)其中的一个。
那我们可以由此建立一个搜索的坐标数组,每次从当前位置搜的时候我们就扩展坐标即可。
令dp[i][j]dp[i][j]dp[i][j]表示从(1,1)(1,1)(1,1)到达(i,j)(i,j)(i,j)位置获得的最大权值。
但是我们当前位置是由前面九个位置决定的,所以我们需要将上面的坐标反推回去。
(−1,−2),(−1,−3),(−1,−4),(−2,−1),(−2,−2),(−2,−3),(−3,−1),(−3,−2),(−4,−1)(-1,-2),(-1,-3),(-1,-4),(-2,-1),(-2,-2),(-2,-3),(-3,-1),(-3,-2),(-4,-1)(−1,−2),(−1,−3),(−1,−4),(−2,−1),(−2,−2),(−2,−3),(−3,−1),(−3,−2),(−4,−1)
那么我们建立一个扩展的坐标数组
//当前位置只能由前面9个位置到达,所以都填了负号public static int[][] dirs={{0,-1},{0,-2},{0,-3},{-1,0},{-1,-1},{-1,-2},{-2,0},{-2,-1},{-3,0}};
每搜索到一个节点(x,y)
,就判断当前的dp[i][j]
和dp[x][y]+a[i]
哪个大即可,状态转移方程如下:
dp[i][j]=Math.max(dp[i][j],dp[x][y]+a[i][j])dp[i][j]=Math.max(dp[i][j],dp[x][y]+a[i][j]) dp[i][j]=Math.max(dp[i][j],dp[x][y]+a[i][j])
完整代码实现:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
import java.util.Arrays;
//dp[i][j]表示从(1,1)到达(i,j)位置获得的最大权值
public class Main {//当前位置只能由前面9个位置到达,所以都填了负号public static int[][] dirs={{0,-1},{0,-2},{0,-3},{-1,0},{-1,-1},{-1,-2},{-2,0},{-2,-1},{-3,0}};public static StreamTokenizer st=new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));public static void main(String[] args) throws IOException {int n = nextInt();int m = nextInt();int[][] a = new int[n + 1][m + 1];int[][] dp = new int[n + 1][m + 1];for (int i = 1; i <=n; i++) {for (int j = 1; j <=m ; j++) {a[i][j]=nextInt();}}for (int[] ints : dp) {Arrays.fill(ints,Integer.MIN_VALUE);}dp[1][1]=a[1][1];//初始化for (int i = 1; i <=n ; i++) {for (int j = 1; j <=m; j++) {for (int k = 0; k <9; k++) {//9个位置扩展//扩展int x = i + dirs[k][0];int y = j + dirs[k][1];if(x>=1&&x<=n&&y>=1&&y<=m){ //判断是否越界dp[i][j]=Math.max(dp[i][j],dp[x][y]+a[i][j]);}}}}System.out.println(dp[n][m]);}public static int nextInt() throws IOException {st.nextToken();return (int)st.nval;}
}
2.2 解法二:DFS深度优先搜索最大权值
使用深度优先遍历,我们对可扩展的方向进行DFS,每次找到终点(n,m)(n,m)(n,m)的时候我们就更新一下最大权值即可。
但是请注意,现在我们是从左上往右下走,所以坐标是正的,此时扩展的方向数组为:
//这里是往右下方向走,所以坐标都是正的public static int[][] dirs={{0,1},{0,2},{0,3},{1,0},{1,1},{1,2},{2,0},{2,1},{3,0}};
完整代码如下:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
public class Main {//这里是往右下方向走,所以坐标都是正的public static int[][] dirs={{0,1},{0,2},{0,3},{1,0},{1,1},{1,2},{2,0},{2,1},{3,0}};public static int n;public static int m;public static int[][] a;public static int cnt=0;public static StreamTokenizer st=new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));public static void main(String[] args) throws IOException {n = nextInt();m = nextInt();a = new int[n + 1][m + 1];for (int i = 1; i <=n; i++) {for (int j = 1; j <=m ; j++) {a[i][j]=nextInt();}}dfs(1,1,a[1][1]);System.out.println(cnt);}public static void dfs(int x,int y,int res){if(x==n&&y==m){ //到达终点之后,更新权值和cnt=Math.max(cnt,res);return;}//开始扩展for (int[] dir : dirs) {//(x,y)下一个位置的坐标(ex,ey)int ex = x + dir[0];int ey = y + dir[1];if(ex>=1&&ex<=n&&ey>=1&&ey<=m){ //判断是否越界dfs(ex,ey,res+a[ex][ey]);}}}public static int nextInt() throws IOException {st.nextToken();return (int)st.nval;}
}
这道题有点类似于那个数字三角形,那个题是只能往右边或者下边走,同样反推回去建立可扩展的坐标数组即可。
相关文章:

跳跃-动态规划问题
跳跃-动态规划问题1、题目描述2、解题思路2.1 解法一:动态规划2.2 解法二:DFS深度优先搜索最大权值1、题目描述 小蓝在一个 n 行 m 列的方格图中玩一个游戏。 开始时,小蓝站在方格图的左上角,即第 11 行第 11 列。 小蓝可以在方格…...

Django笔记三十九之settings配置介绍
这一篇笔记介绍 Django 里 settings.py 里一些常用的配置项,这些配置有一些是在之前的笔记中有过介绍的,比如 logging 的日志配置,session 的会话配置等,这里就只做一下简单的回顾,有一些是之前没有介绍过的就着重介绍…...

【JavaSE】类和对象(中)
类和对象(中)4. this引用4.1 为什么要有this引用4.2 什么是this引用4.3 this引用的特性5. 对象的构造及初始化5.1 如何初始化对象5.2 构造方法(构造器)5.2.1 概念5.2.2 特性5.3 默认初始化5.4 就地初始化6. 封装6.1 封装的概念6.2…...

C语言例程:学生成绩管理程序
学生成绩管理程序 实例说明 编制一个统计存储在文件中的学生考试分数的管理程序。设学生成绩以一个学生一条记录的 形式存储在文件中,每个学生记录包含的信息有姓名、学号和各门功课的成绩。要求编制具有以 下几项功能的程序:求出各门课程的总分&#…...

完美日记母公司再度携手中国妇基会,以“创美人生”助力女性成长
撰稿 | 多客 来源 | 贝多财经 当春时节,梦想花开。和煦的三月暖阳,唤醒的不止是满城春意,更有逸仙电商“创美人生”公益项目播撒的一份希望。 3月8日“国际妇女节”当日,为积极响应我国促进共同富裕的政策倡导,助力相…...

【JaveEE】线程的创建及常见方法解析(Tread类)
目录 1.Tread类介绍 2线程的构造方法——创建线程 1.继承Thread类,重写run()方法 2.使用Runnbable接口创建线程 3.继承 Thread, 重写 run, 使用匿名内部类 4.实现 Runnable, 重写 run, 使用匿名内部类 5.使用 lambda 表达式(重点掌握)…...

Linux的诞生过程
个人简介:云计算网络运维专业人员,了解运维知识,掌握TCP/IP协议,每天分享网络运维知识与技能。座右铭:海不辞水,故能成其大;山不辞石,故能成其高。个人主页:小李会科技的…...

面部表情识别1:表情识别数据集(含下载链接)
面部表情识别1:表情识别数据集(含下载链接) 目录 面部表情识别1:表情识别数据集(含下载链接) 1.前言 2.表情识别数据集介绍 1.JAFFE数据集 2.KDEF(Karolinska Directed Emotional Faces)数据集 3.GENKI数据集 4.RaFD数据集…...

CSS实现文字凹凸效果
使用两个div分别用来实现凹凸效果;text-shadow语法 text-shadow: h-shadow v-shadow blur color; h-shadow:必需。水平阴影的位置。允许负值。 v-shadow :必需。垂直阴影的位置。允许负值。 blur:可选,模糊的距离。 co…...
嵌入式常使用的库函数
自己创建简单的mcu中常用的库函数 文章目录自己创建简单的mcu中常用的库函数1. 自己编写库函数的意义2. 计算字符串长度.以\0作为结束符3. 复制字符串4. 字符串比较5. 将整数转换为ASCII数组6. 将ASCII码字符串转换成整数7. 将字节数组转换为16位整数8.计算CRC,用于Modbus协议9…...

【业务安全-02】业务逻辑漏洞之越权操作
越权越权即越权查看被人的信息,又分为水平越权和垂直越权,但是两者的本质都是一样的,只是越权的身份权限不一样而已水平越权:相同级别的用户,如用户A访问用户B垂直越权:普通用户到管理员,普通用…...

完全小白的pycharm深度学习调试+for循环断点条件设置
完全小白的pycharm深度学习调试for循环断点条件设置写在最前面基础方法pycharm断点调试控制台输入代码中循环的debug方法pycharm中图标的介绍常见的BugDebug经验1. 检查激活函数的输入值2. 检查梯度3. 消融实验4. 使用最短的时间5. 静下心来写在最前面 之前把seq2seqattention…...

直方图及其应用
直方图定义直方图是一种描述数据的分布通过将连续变量划分成一系列区间,统计区间频率,并用来表示,以表征其统计特征在图像处理中,直方图可以用来表示图像中像素值的分布状况,描述不同灰度级的像素在图像中的占比直方图…...

《SpringBoot篇》26.SpringBoot整合Jackson超详细教程(附Jackson工具类)
陈老老老板🦸👨💻本文专栏:SpringBoot篇(主要讲一些与springboot整合相关的内容)👨💻本文简述:本文讲一下Jackson常见用法,超级详细。👨&am…...

Redis 如何实现库存扣减操作和防止被超卖?
本文已经收录到Github仓库,该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点,欢迎star~ Github地址:https://github.com/…...
(Linux)Ubuntu查看系统版本
uname -a : 查看操作系统的发行版号和操作系统版本 Command: uname -aResult: Linux SERVER 5.19.0-35-generic #36-Ubuntu SMP PREEMPT_DYNAMIC Fri Feb 3 18:36:56 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux uname -v : 查看版本号 Command: uname -vResult: #36-Ubuntu …...
VxWorkds 内存管理(3)
虚拟内存管理 对于带MMU的目标板,VxWorks提供虚拟内存的支持,VxWorks提供了两种虚拟内存管理单元(MMU)的支持: 基本MMU和VxVMI 基本MMU邦定于VxWorks中,可以通过config.h中宏定义INCLUDE MMU BASIC或Tornado工程配置中包含基本MMU组件 VxV…...

单元测试、反射、注解、动态代理
🏡个人主页 : 守夜人st 🚀系列专栏:Java …持续更新中敬请关注… 🙉博主简介:软件工程专业,在校学生,写博客是为了总结回顾一些所学知识点 目录单元测试、反射、注解、动态代理单元测…...

【数据结构】夯实基础|线性表刷题01
作者:努力学习的大一在校计算机专业学生,热爱学习和创作。目前在学习和分享:算法、数据结构、Java等相关知识。博主主页: 是瑶瑶子啦所属专栏: 【数据结构|刷题专栏】:该专栏专注于数据结构知识,持续更新&a…...

Java怎么实现几十万条数据插入(30万条数据插入MySQL仅需13秒)
本文主要讲述通过MyBatis、JDBC等做大数据量数据插入的案例和结果。 30万条数据插入插入数据库验证实体类、mapper和配置文件定义User实体mapper接口mapper.xml文件jdbc.propertiessqlMapConfig.xml不分批次直接梭哈循环逐条插入MyBatis实现插入30万条数据JDBC实现插入30万条数…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...

ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist
现象: android studio报错: [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决: 不要动CMakeLists.…...
Docker拉取MySQL后数据库连接失败的解决方案
在使用Docker部署MySQL时,拉取并启动容器后,有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致,包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因,并提供解决方案。 一、确认MySQL容器的运行状态 …...

在 Visual Studio Code 中使用驭码 CodeRider 提升开发效率:以冒泡排序为例
目录 前言1 插件安装与配置1.1 安装驭码 CodeRider1.2 初始配置建议 2 示例代码:冒泡排序3 驭码 CodeRider 功能详解3.1 功能概览3.2 代码解释功能3.3 自动注释生成3.4 逻辑修改功能3.5 单元测试自动生成3.6 代码优化建议 4 驭码的实际应用建议5 常见问题与解决建议…...