力扣每日一题 超级饮料的最大强化能量 动态规划(dp)

server/2024/11/29 0:09:51/

来自未来的体育科学家给你两个整数数组 energyDrinkA 和 energyDrinkB,数组长度都等于 n。这两个数组分别代表 A、B 两种不同能量饮料每小时所能提供的强化能量。

你需要每小时饮用一种能量饮料来 最大化 你的总强化能量。然而,如果从一种能量饮料切换到另一种,你需要等待一小时来梳理身体的能量体系(在那个小时里你将不会获得任何强化能量)。

返回在接下来的 n 小时内你能获得的 最大 总强化能量。

注意 你可以选择从饮用任意一种能量饮料开始。  

示例 1: 输入:energyDrinkA = [1,3,1], energyDrinkB = [3,1,1] 输出:5

解释: 要想获得 5 点强化能量,需要选择只饮用能量饮料 A(或者只饮用 B)。

示例 2: 输入:energyDrinkA = [4,1,1], energyDrinkB = [1,1,3] 输出:7

解释:

• 第一个小时饮用能量饮料 A。

• 切换到能量饮料 B ,在第二个小时无法获得强化能量。

• 第三个小时饮用能量饮料 B ,并获得强化能量。   

 思路

这题题目描述有点不明确,概括一下题意就是有有两个饮料序列,分别代表饮料在1-n小时的能量值,开始时可以选择任意一种饮料饮用,每个小时只能选择一瓶饮料引用,如果你刚开始选的是第一种饮料,后面想要喝第二种饮料的话就需要等待一小时,即下一个小时无法饮用任何饮料,求第n小时过后能获得多少能量

题目中提到了如果要切换饮料种类就需要空等一小时,如果按照贪心的策略想的话这肯定是不合理的,所以这题不能用贪心解,所以当我们决定切换饮料,一定是我们可以获得更大收益的,这两天正好在学习dp,一瞬间就想到改用dp来解

设置数组 

long[][] dp=new long[n+1][2];

dp[i][0]代表第i时刻选择饮料A所能获得的最大能量

dp[i][1]代表第i时刻选择饮料B所能获得的最大能量

假设当前选择能量A又有两种两种可能

1.前一次选择的也是能量A  即 dp[i][0]= dp[i-1][0]  + energyDrinkA[i]

2.前一次选的是能量B         则 dp[i][0]= dp[i-2][1]   + energyDrinkA[i];

两者之中取较大值,可得

 dp[i][0]=Math.max(dp[i-1][0],dp[i-2][1])+energyDrinkA[i];

同理,饮料B的递推公式  dp[i][1]=Math.max(  dp[i-1][1] ,  dp[i-2][0] ) +  energyDrinkB[i];

初始化

java">        dp[0][0]=energyDrinkA[0];dp[0][1]=energyDrinkB[0];dp[1][0]=dp[0][0]+energyDrinkA[1];dp[1][1]=dp[0][1]+energyDrinkB[1];

下标为0的就是第一次喝饮料,直接取第一个饮料的能量即可

对于第二次选择,由于饮料的种类转移需要花费一个小时的时间,而前两次仅仅只有两个小时的时间,转移饮料种类无法获得任何能量,只会浪费第二个小时的时间,所以前两次都喝相同的饮料

 完整代码

java">class Solution {public long maxEnergyBoost(int[] energyDrinkA, int[] energyDrinkB) {int n=energyDrinkA.length;long[][] dp=new long[n+1][2];dp[0][0]=energyDrinkA[0];dp[0][1]=energyDrinkB[0];dp[1][0]=dp[0][0]+energyDrinkA[1];dp[1][1]=dp[0][1]+energyDrinkB[1];for(int i=2;i<n;i++){dp[i][0]=Math.max(dp[i-1][0],dp[i-2][1])+energyDrinkA[i];dp[i][1]=Math.max(dp[i-1][1],dp[i-2][0])+energyDrinkB[i];}return Math.max(dp[n-1][0],dp[n-1][1]);}
}


http://www.ppmy.cn/server/137618.html

相关文章

关于供电不足导致的问题

如果你发现你的代码没有问题&#xff0c;但是机器却不能正常工作 那大概率就是供电不足导致的 比如一些需要检测或接收的模块&#xff1a; 蓝牙模块&#xff08;蓝牙总是中断&#xff09;、 红外循迹模块&#xff08;发出的红外线量较少&#xff09;、 超声波模块(发出的声…

Flutter图片控件(七)

1、加载图片 import package:flutter/material.dart;void main() {runApp(const MaterialApp(home: MyHomePage(),)); }class MyHomePage extends StatelessWidget {const MyHomePage({super.key});overrideWidget build(BuildContext context) {return Scaffold(appBar: AppB…

不适合的学习方法

文章目录 不适合的学习方法1. 纯粹死记硬背2. 过度依赖单一资料3. 线性学习4. 被动学习5. 一次性学习6. 忽视实践7. 缺乏目标导向8. 过度依赖技术9. 忽视个人学习风格10. 过于频繁的切换 结论 以下是关于不适合的学习方法的更详细描述&#xff0c;包括额外的内容和相关公式&…

【Spring源码核心篇-01】精通Spring的bean的生命周期

Spring源码核心篇整体栏目 内容链接地址【一】Spring的bean的生命周期https://zhenghuisheng.blog.csdn.net/article/details/143441012 spring的bean的生命周期 一&#xff0c;spring中bean的生命周期1&#xff0c;生成BeanDefinition1.1&#xff0c;初始化context和BeanFacto…

练习LabVIEW第二十六题

学习目标&#xff1a; 刚学了LabVIEW&#xff0c;在网上找了些题&#xff0c;练习一下LabVIEW&#xff0c;有不对不好不足的地方欢迎指正&#xff01; 第二十五题&#xff1a; (1)显示一个二维数组的行数和列数&#xff1b; (2)查找一个二维数组中最大值,以及最大值在数组中…

网站安全,WAF网站保护暴力破解

雷池的核心功能 通过过滤和监控 Web 应用与互联网之间的 HTTP 流量&#xff0c;功能包括&#xff1a; SQL 注入保护&#xff1a;防止恶意 SQL 代码的注入&#xff0c;保护网站数据安全。跨站脚本攻击 (XSS)&#xff1a;阻止攻击者在用户浏览器中执行恶意脚本。暴力破解防护&a…

SpringMVC学习(1)

目录 一、什么是SpringMVC 二、中心控制器&#xff08;DispatcherServlet&#xff09; 三、SpringMVC的执行原理 一、什么是SpringMVC 是Spring Framework的一部分&#xff0c;是基于Java实现MVC的轻量级Web框架 特点&#xff1a; 1、轻量级&#xff0c;简单易学 2、高效…

docker 安装 PostgreSQL

参考链接 https://hub.docker.com/_/postgres 安装 # 后台运行&#xff0c;镜像名称为 postgres # --name postgres 容器名称为 postgres # POSTGRES_PASSWORD 超级用户的密码&#xff0c;超级用户名默认为&#xff1a;postgres&#xff0c;可以使用 POSTGRES_USER 环境变量设…