【华为OD-E卷 - 跳格子2 100分(python、java、c++、js、c)】

news/2025/2/5 19:09:39/

pythonjavacjsc_0">【华为OD-E卷 - 跳格子2 100分(pythonjava、c++、js、c)】

题目

小明和朋友玩跳格子游戏,有 n 个连续格子组成的圆圈,每个格子有不同的分数,小朋友可以选择以任意格子起跳,但是不能跳连续的格子,不能回头跳,也不能超过一圈;
给定一个代表每个格子得分的非负整数数组,计算能够得到的最高分数

输入描述

  • 给定一个数例,第一个格子和最后一个格子首尾相连,如: 2 3 2

输出描述

  • 输出能够得到的最高分,如: 3

备注

  • 1 ≤ nums.length ≤ 100 1 ≤ nums[i] ≤ 1000

用例

用例一:
输入:
2 3 2
输出:
3
用例二:
输入:
1 2 3 1
输出:
4

python_50">python解法

  • 解题思路:
  • 在这里插入图片描述
python"># 读取输入数据,将其转换为整数列表
vals = list(map(int, input().split()))# 计算线性数组的最大不相邻子序列和
def max_points(arr):n = len(arr)# 如果数组只有一个元素,直接返回它if n == 1:return arr[0]# 初始化 dp 数组p = [0] * n# 只有一个元素时,最大值就是该元素p[0] = arr[0]# 如果有两个元素,取较大的那个if n > 1:p[1] = max(arr[0], arr[1])# 动态规划填充数组for i in range(2, n):# 核心转移方程:当前最优解 = max(不选当前元素, 选当前元素)p[i] = max(p[i-1], p[i-2] + arr[i])# 返回最后一个位置的最大值,即最终结果return p[-1]# 计算环形数组的最大不相邻子序列和
def find_max():# 如果数组只有一个元素,直接返回它if len(vals) == 1:return vals[0]# 取两种情况的最大值return max(max_points(vals[:-1]), max_points(vals[1:]))# 输出最终结果
print(find_max())

java_100">java解法

  • 解题思路
  • 在这里插入图片描述
java">import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);// 读取输入,使用空格分隔字符串,并转换为整数数组String[] input = sc.nextLine().split(" ");int[] vals = new int[input.length];for (int i = 0; i < input.length; i++) {vals[i] = Integer.parseInt(input[i]);}// 计算并输出最大得分System.out.println(findMax(vals));}// 计算线性数组的最大不相邻子序列和public static int maxPoints(int[] arr) {int n = arr.length;// 只有一个元素,直接返回它if (n == 1) {return arr[0];}// 动态规划数组int[] p = new int[n];// 初始状态p[0] = arr[0];// 只有两个元素时,取较大的if (n > 1) {p[1] = Math.max(arr[0], arr[1]);}// 递推填充动态规划数组for (int i = 2; i < n; i++) {p[i] = Math.max(p[i - 1], p[i - 2] + arr[i]);}// 返回最后一个位置的最大值return p[n - 1];}// 计算环形数组的最大不相邻子序列和public static int findMax(int[] vals) {int n = vals.length;// 如果数组只有一个元素,直接返回它if (n == 1) {return vals[0];}// 创建两个新的数组:// 1. vals1 代表去掉最后一个元素的子数组// 2. vals2 代表去掉第一个元素的子数组int[] vals1 = new int[n - 1];int[] vals2 = new int[n - 1];// 复制 vals[0] 到 vals[n-2] 形成 vals1System.arraycopy(vals, 0, vals1, 0, n - 1);// 复制 vals[1] 到 vals[n-1] 形成 vals2System.arraycopy(vals, 1, vals2, 0, n - 1);// 取两个子数组的最大得分return Math.max(maxPoints(vals1), maxPoints(vals2));}
}

C++解法

  • 解题思路
更新中

C解法

  • 解题思路

更新中

JS解法

  • 解题思路

  • 在这里插入图片描述

javascript">const readline = require("readline");const rl = readline.createInterface({input: process.stdin,output: process.stdout,
});// 监听标准输入,读取一行数据
rl.on("line", (line) => {// 将输入字符串拆分成整数数组const nums = line.split(" ").map(Number);// 计算最大得分并输出console.log(computeMaxScore(nums));
});/*** 计算环形数组的最大不相邻子序列和* @param {number[]} nums 输入的环形数组* @returns {number} 最大得分*/
function computeMaxScore(nums) {const n = nums.length;// 如果数组只有一个元素,直接返回它if (n === 1) return nums[0];// 计算去掉最后一个元素 和 去掉第一个元素 两种情况的最大值return Math.max(calcMax(nums.slice(0, -1)), calcMax(nums.slice(1)));
}/*** 计算线性数组的最大不相邻子序列和(递归+记忆化)* @param {number[]} arr 线性数组* @returns {number} 最大得分*/
function calcMax(arr) {// 创建 memo 数组用于记忆化,初始值为 -1,表示未计算const memo = new Array(arr.length).fill(-1);// 调用递归计算最大得分return maxWithMemo(arr, arr.length - 1, memo);
}/*** 递归计算最大得分,使用记忆化优化* @param {number[]} arr 线性数组* @param {number} i 当前索引* @param {number[]} memo 记忆化数组* @returns {number} 计算到 i 位置的最大得分*/
function maxWithMemo(arr, i, memo) {// 边界情况:索引小于 0,返回 0(无贡献)if (i < 0) return 0;// 如果 memo[i] 已经计算过,直接返回if (memo[i] !== -1) return memo[i];// 计算当前索引的最优解,并存入 memo 数组memo[i] = Math.max(maxWithMemo(arr, i - 1, memo),       // 不取 arr[i],继承之前的最大值maxWithMemo(arr, i - 2, memo) + arr[i] // 取 arr[i],但必须跳过 arr[i-1]);return memo[i];
}

注意:

如果发现代码有用例覆盖不到的情况,欢迎反馈!会在第一时间修正,更新。
解题不易,如对您有帮助,欢迎点赞/收藏


http://www.ppmy.cn/news/1569578.html

相关文章

前端知识速记--CSS篇:display

前端知识速记–CSS篇&#xff1a;display 一、什么是 display 属性&#xff1f; display 属性用于指定一个元素如何被显示在网页上。它不仅影响元素的显示形式&#xff0c;还对元素的布局、结构以及与其他元素之间的关系产生重要影响。 二、常用 display 属性值 1. block …

如何实现网页不用刷新也能更新

要实现用户在网页上不用刷新也能到下一题&#xff0c;可以使用 前端和后端交互的技术&#xff0c;比如 AJAX&#xff08;Asynchronous JavaScript and XML&#xff09;、Fetch API 或 WebSocket 来实现局部页面更新。以下是一个实现思路&#xff1a; 1. 使用前端 AJAX 或 Fetch…

Linux下的编辑器 —— vim

目录 1.什么是vim 2.vim的模式 认识常用的三种模式 三种模式之间的切换 命令模式和插入模式的转化 命令模式和底行模式的转化 插入模式和底行模式的转化 3.命令模式下的命令集 光标移动相关的命令 复制粘贴相关命令 撤销删除相关命令 查找相关命令 批量化注释和去…

保姆级教程Docker部署Kafka官方镜像

目录 一、安装Docker及可视化工具 二、单节点部署 1、创建挂载目录 2、运行Kafka容器 3、Compose运行Kafka容器 4、查看Kafka运行状态 三、集群部署 四、部署可视化工具 1、创建挂载目录 2、运行Kafka-ui容器 3、Compose运行Kafka-ui容器 4、查看Kafka-ui运行状态 …

C基础寒假练习(8)

一、终端输入10个学生成绩&#xff0c;使用冒泡排序对学生成绩从低到高排序 #include <stdio.h> int main(int argc, const char *argv[]) {int arr[10]; // 定义一个长度为10的整型数组&#xff0c;用于存储学生成绩int len sizeof(arr) / sizeof(arr[0]); // 计算数组…

个人c项目 java项目解释

1. 测试环境与方法 中文&#xff1a; 本地测试环境&#xff1a;可以在一台配置中等的电脑上构建一个测试环境&#xff0c;利用现成的大词库数据&#xff08;例如英文词典或自定义数据集&#xff09;来构建 Trie。使用 C 语言的编译器&#xff08;例如 gcc&#xff09;编译项目&…

【免费】2007-2019年各省科技支出占一般公共预算支出的比重数据

2007-2019年各省科技支出占一般公共预算支出的比重数据 1、时间&#xff1a;2007-2019年 2、来源&#xff1a;国家统计局、统计年鉴 3、指标&#xff1a;行政区划代码、地区名称、年份、科技支出占一般公共预算支出的比重 4、范围&#xff1a;31省 5、指标解释&#xff1a…

《深度揭秘LDA:开启人工智能降维与分类优化的大门》

在当今人工智能蓬勃发展的时代&#xff0c;数据成为了驱动技术进步的核心要素。随着数据采集和存储技术的飞速发展&#xff0c;我们所面临的数据量不仅日益庞大&#xff0c;其维度也愈发复杂。高维数据虽然蕴含着丰富的信息&#xff0c;但却给机器学习算法带来了一系列严峻的挑…