【华为OD题库-036】跳格子2-java

news/2024/7/20 19:17:02 标签: 华为od, java

题目

小明和朋友玩跳格子游戏,有n个连续格子组成的圆圈,每个格子有不同的分数,小朋友可以选择从任意格子起跳,但是不能跳连续的格子,不能回头跳,也不能超过一圈:给定一个代表每个格子得分的非负整数数组,计算能够得到的最高分数。
输入描述
给定一个数例,第一个格子和最后一个格子收尾相连,如: 2 3 2
输出描述
输出能够得到的最高分,如: 3
说明
1 <= nums.length <= 100
0 <= nums[] <= 1000
示例1:
输入
2 3 2
输出
说明只能跳3这个格子,因为第一个格子和第三个格子收尾相连
示例2
输入
1 2 3 1
输出
4
说明
1+3=4

思路

先不考虑首尾限制,原题转化为,在一个数组中,找到非连续的格子组合,使其得分最大。
可以考虑动态规划解决。以数据为例:94 40 49 65 10
定义dp[i]代表,在前i个数据时,满足条件的最高分数
初始值:
dp[0]代表只有一个数据,得分应该为nums[0]
dp[1]代表在前两个数据跳,不能相邻,所以dp[1]=max(nums[0],nums[1])
对于i>1的情况,dp[i]分两种情况,取当前值和不取当前值;
如果取当前值,那么最大值为:dp[i-2]+nums[i]
如果不取当前值,那么最大值为:dp[i-1]
dp[i]应该为两者的较大值,即dp[i]=max(dp[i-2]+nums[i],dp[i-1])
从上面的结果来看,我们只关心当前值的上一个值和上上个值,可以使用两个变量来代替dp。
现在考虑首尾限制,可以分为一下两种情况:

  1. 选了第一个就不能选择最后一个
  2. 不选第一个则可以选择最后一个

分别按照不考虑的逻辑计算上面两种情况的结果,然后取较大结果即可。

题解

java">package hwod;

import java.util.Arrays;
import java.util.Scanner;

public class JumpCell {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int[] nums = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
        System.out.println(jumpCell(nums));
    }

    private static int jumpCell(int[] nums) {
        int length = nums.length;
        if(length==1) return nums[0];
        if(length==2) return Math.max(nums[0], nums[1]);
        return Math.max(jumpCellRange(nums, 0, length - 2), jumpCellRange(nums, 1, length - 1));
    }

    private static int jumpCellRange(int[] nums, int start, int end) {
        int before = nums[start], after = Math.max(nums[start], nums[start + 1]);
        for (int i = start + 2; i <= end; i++) {
            int temp = after;
            after = Math.max(before + nums[i], after);
            before = temp;
        }
        return after;
    }
}

推荐

如果你对本系列的其他题目感兴趣,可以参考华为OD机试真题及题解(JAVA),查看当前专栏更新的所有题目。


http://www.niftyadmin.cn/n/5219889.html

相关文章

再探Docker:从Docker基础到跨服务器部署

摘要&#xff1a; 这篇文章将从介绍Docker基础开始&#xff0c;逐步讲解如何创建镜像、使用Docker Compose编排容器、在Docker中更新部署环境&#xff0c;将更新后的环境打包为镜像并导出为tar包&#xff0c;最后在其他服务器上应用这个镜像。 1. Docker是什么 Docker是一种容…

C#,《小白学程序》第二十二课:大数的乘法(BigInteger Multiply)

1 文本格式 using System; using System.Linq; using System.Text; using System.Collections.Generic; /// <summary> /// 大数的&#xff08;加减乘除&#xff09;四则运算、阶乘运算 /// 乘法计算包括小学生算法、Karatsuba和Toom-Cook3算法 /// </summary> p…

Android Termux SFTP如何实现远程文件传输

文章目录 1. 安装openSSH2. 安装cpolar3. 远程SFTP连接配置4. 远程SFTP访问4. 配置固定远程连接地址 SFTP&#xff08;SSH File Transfer Protocol&#xff09;是一种基于SSH&#xff08;Secure Shell&#xff09;安全协议的文件传输协议。与FTP协议相比&#xff0c;SFTP使用了…

kubectl系列(五)-kubectl scale 命令最佳实践

1 概述 kubectl scale命令通过调整正在运行的容器的数量来立即缩放应用程序。这是增加部署副本数量的最快、最简单的方法&#xff0c;可用于应对服务高峰以及日常维护变更。 在本文中将了解如何使用kubectl scale来扩展一个简单的Kubernetes Deployment&#xff0c;同时还将更…

激光雷达点云分割算法综述

参考「深度解析」&#xff1a;探究自动驾驶中的激光雷达点云分割算法-人工智能-PHP中文网

D365 CRM Power Platform 后端开发概览

博主十年前写的后端技术文章大部分都out-of-date啦&#xff0c;有些东西还能在PP系统中继续沿用&#xff0c;大部分东西都变成old fashion了。 博主后续争取多找些时间&#xff0c;将之前的后端开发文档都翻新一遍&#xff0c;争取与时俱进&#xff0c;让它们还能继续使用下个…

【算法】快速选择算法

目录 1.概述2.代码实现2.1.基于简单交换排序2.2.基于堆排序2.3.基于快速排序 3.应用 更多数据结构与算法的相关知识可以查看数据结构与算法这一专栏。 1.概述 &#xff08;1&#xff09;快速选择算法 (Quick Select Algorithm) 是一种用于在无序数组中寻找第 k 小&#xff08;…

Python实现艺术设计?提取图片中颜色并绘制成可视化图表,从大师作品中提取配色方案

文章目录 导入模块并加载图片提取颜色并整合成表格绘制图表实战环节关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③Python小游戏源码五、面试资料六、Python兼职渠…