当前位置: 首页 > news >正文

F.动态规划-入门DP-打家劫舍:2140. 解决智力问题

题目链接:2140. 解决智力问题(中等)

算法原理:

对比上一题:F.动态规划-入门DP-打家劫舍:3186. 施咒的最大总伤害

体现更简单:避免了准备打家劫舍的值域预处理

体现更困难:从隔2个变成了隔x个,x是未知的,且这个x是后续的,而不是隔前边的

解法:动态规划

7ms击败31.58%

时间复杂度O(N)

①状态表示:

f[i]:选第i题能获得的最高分数

g[i]:不选第i题能获得的最高分数

②状态转移方程:

由于从左往右填表时,我们获取到了当前状态 i ,但此时我们累加时需要的是前 x 题不能选,但这个x却早已经遍历过了,当前状态下的”后续x题不能选“根本没用上,纯🤡了,因此我们需要从后往前遍历,用 j = i +nums[i]找到最后一个不合法的位置,那么 j +1就是第一个合法的状态了,边界状态判断和图解见👇只是遍历顺序改了一下,大致思路是一样的

F.动态规划-入门DP-打家劫舍:3186. 施咒的最大总伤害

当前不选:前一个可选可不选,要最大值

g[i]=Math.max(f[i+1],g[i+1]);

当前选:前一个合法位置可选可不选,要最大值

f[i]=Math.max(f[j+1],g[j+1])+nums[i][0];

其中如果j+1越界时,Math.max(f[j+1],g[j+1])为0

③初始化:

f[n-1]=nums[n-1][0]

g[n-1]=0

④填表顺序:

从右往左

⑤返回值:

max(f[0],g[0])

答疑

Q1:为什么3186. 施咒的最大总伤害不能倒着遍历,然后用 j =x+2快速找到最后一个不合法的位置呢?

因为上题的x是伤害值,是数值上的关系,而非索引位置,此题我们找的时候不管数值上是什么关系,纯是找第j = i +nums[i]个位置,因此上题不能直接这么找

空间优化

4ms击败100.00%

时间复杂度O(N)

①状态表示:

dp[i]:处理到第i题能获得的最高分数

②状态转移方程:

优化思路与F.动态规划-入门DP-打家劫舍:3186. 施咒的最大总伤害完全相同

综合两个式子:

当前不选:前一个可选可不选,要最大值

g[i]=Math.max(f[i+1],g[i+1]);dp[i]=dp[i+1]

当前选:前一个合法位置可选可不选,要最大值

f[i]=Math.max(f[j+1],g[j+1])+nums[i][0];dp[i]=dp[j+1]+nums[i][0]

因此dp[i]=max(dp[i+1],dp[j+1]+nums[i][0])

其中如果j+1越界时,dp[j+1[为0

③初始化:

dp[n-1]要想最大化,就必须选,因此dp[n-1]=nums[n-1][0]

④填表顺序:

从右往左

⑤返回值:

dp[0]

Java代码:

class Solution { public long mostPoints(int[][] nums) { int n=nums.length; //选第i题能获得的最高分数 long[] f=new long[n]; f[n-1]=nums[n-1][0]; //不选第i题能获得的最高分数 long[] g=new long[n]; g[n-1]=0; for(int i=n-2;i>=0;i--){ //不选 g[i]=Math.max(f[i+1],g[i+1]); //选 //后nums[i][1]题不能选 int j=i+nums[i][1]; f[i]=(j+1<n?Math.max(f[j+1],g[j+1]):0)+nums[i][0]; } return Math.max(f[0],g[0]); } }
class Solution { //空间优化版 public long mostPoints(int[][] nums) { int n=nums.length; //处理到第i题能获得的最高分数 long[] dp=new long[n]; dp[n-1]=nums[n-1][0]; for(int i=n-2;i>=0;i--){ //前一个的最大贡献 int j=i+nums[i][1]; long maxC=j+1<n?dp[j+1]:0; dp[i]=Math.max(dp[i+1],maxC+nums[i][0]); } return dp[0]; } }
http://www.jsqmd.com/news/453532/

相关文章:

  • Vue3重新登录后Store内容未清理解释
  • OpenClaw MAC Mini 配置
  • 揭秘 PyTorch 底层黑魔法:Stride 机制与“零拷贝”的艺术
  • AI写真不求人:ComfyUI Qwen人脸生成图像实战教程
  • Spring的xml方式声明式事务控制
  • 2026年江苏宇灿智能装备有限公司产品好用吗,宇灿智能装备可信度高吗排名 - myqiye
  • RetinaFace在Linux系统上的部署教程:从零开始搭建人脸检测环境
  • Gemma-3-12B-IT在STM32嵌入式开发中的边缘计算应用
  • Python字符串strip函数作用
  • MouseEngine 进一步美化你的光标
  • 【2025最新】基于SpringBoot+Vue的产业园区智慧公寓管理系统管理系统源码+MyBatis+MySQL
  • 【书生·浦语】internlm2-chat-1.8b效果惊艳:长篇小说续写风格一致性保持演示
  • GLM-Image WebUI部署教程:系统监控(GPU温度/显存/负载)集成方案
  • 键位映射操作:KeybMap的使用方法
  • Java Web 车险理赔信息管理系统系统源码-SpringBoot2+Vue3+MyBatis-Plus+MySQL8.0【含文档】
  • RVC在内容创作中的应用:短视频配音/虚拟主播落地实践
  • Hash哈希表以及代码
  • 雷达原理(第三版) 丁鹭飞 中最主要的公式
  • Flutter SVG图片Demo
  • 编译器优化屏障使用
  • 基于SpringBoot+Vue的船舶监造系统管理系统设计与实现【Java+MySQL+MyBatis完整源码】
  • 【ArcGIS技巧】表格批量转图片(emf格式)方便相对路径索引表格
  • Qwen3-ASR-0.6B语音识别实测:轻量级模型,专业级效果,小白也能用
  • redis具体情况介绍
  • 云容笔谈微信小程序前端开发实战:打造个人AI画师工具
  • HeyGem数字人视频生成系统批量版:5分钟快速部署,新手也能轻松上手
  • L1-020 帅到没朋友(分数20)
  • 索引和事务
  • 一键部署梦幻动漫魔法工坊:快速搭建你的二次元创作平台
  • 探寻2026年贵阳诚信的网络营销培训学校,怎么选择更合适 - myqiye