【OJ】动归练习四

2024-03-28 18:44
文章标签 练习 oj 动归

本文主要是介绍【OJ】动归练习四,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

个人主页 : zxctscl
如有转载请先通知

题目

  • 1. 面试题 17.16. 按摩师
    • 1.1 分析
    • 1.2 代码
  • 2. 198. 打家劫舍
    • 2.1 分析
    • 2.2 代码
  • 3. 213.打家劫舍 II
    • 3.1 分析
    • 3.2 代码

1. 面试题 17.16. 按摩师

在这里插入图片描述

1.1 分析

  1. 状态表示
    以i位置为结尾总的分钟数最长,这里要考虑,要不要选择i位置的值。
    就分两种情况,如果选择了i位置那么就记为f[i];
    如果没有选择i位置的值就记为g[i]。

  2. 状态转移方程
    要考虑到达i位置时候,这个位置选择了就得加上这个位置对应的值nums[i],那么它前面的位置i-1就不能选择,这个时候的状态转移方程就是f[i]=g[i-1]+nums[i];
    如果不选择这个位置,那么它前面的位置i-1也可以选也可以不选,如果选就是f[i-1],如果不选择就是g[i-1],比较一下取大的一个就行,这个时候的状态转移方程就是g[i]=max(f[i-1],g[i-1])。

  3. 初始化
    得考虑第一个位置,如果选择,那么就是这个位置对应的值f[0]=nums[0];如果不选择,那么这个位置的值就是0:g[0]=0。
    如果给的数据为空,就直接返回0。

  4. 填表顺序
    从左往右

  5. 返回值
    按题目要求返回最后一个位置最长时间就行,取两种选择中大的那个max(f[n-1],g[n-1])。
    在这里插入图片描述

1.2 代码

class Solution {
public:int massage(vector<int>& nums) {int n=nums.size();if(n==0)return 0;vector<int> f(n);auto g=f;f[0]=nums[0];g[0]=0;for(int i=1;i<n;i++){f[i]=g[i-1]+nums[i];g[i]=max(f[i-1],g[i-1]);}return max(f[n-1],g[n-1]);}
};

2. 198. 打家劫舍

在这里插入图片描述

2.1 分析

这个题目和上面那个题分析一模一样

2.2 代码

class Solution {
public:int massage(vector<int>& nums) {int n=nums.size();if(n==0)return 0;vector<int> f(n);auto g=f;f[0]=nums[0];g[0]=0;for(int i=1;i<n;i++){f[i]=g[i-1]+nums[i];g[i]=max(f[i-1],g[i-1]);}return max(f[n-1],g[n-1]);}
};

3. 213.打家劫舍 II

在这里插入图片描述

3.1 分析

题目与上面一个题不同的是,这里首位是相连的,而相连的不可以偷。
在这里插入图片描述
那么就转换为两个像打家劫舍的问题。
有两种情况:一、偷第一个位置,那么n-1位置就不能偷,那么2到n-2,就可以像打家劫舍那样偷。二、不偷第一个位置,那么n-1位置就偷,那么1到n-1位置就可以像打家劫舍那样偷。
所以这里就通过分类将环形问题,转换为上面两个线性的打家劫舍问题。

  1. 状态表示
    以i位置为结尾总的金额最和大,这里要考虑,要不要选择i位置的值。
    就分两种情况,如果选择了i位置那么就记为f[i],还得加上这个位置对应的值nums[i],就是此时的最大金额;
    如果没有选择i位置的值就记为g[i],表示此时的最大金额。

  2. 状态转移方程
    要考虑到达i位置时候,这个位置选择了就得加上这个位置对应的值nums[i],那么它前面的位置i-1就不能选择,这个时候的状态转移方程就是f[i]=g[i-1]+nums[i];
    如果不选择这个位置,那么它前面的位置i-1也可以选也可以不选,如果选就是f[i-1],如果不选择就是g[i-1],比较一下取大的一个就行,这个时候的状态转移方程就是g[i]=max(f[i-1],g[i-1])。

  3. 初始化
    得考虑第一个位置,如果选择,那么就是这个位置对应的值f[0]=nums[0];如果不选择,那么这个位置的值就是0:g[0]=0。
    如果给的数据为空,就直接返回0。

  4. 填表顺序
    从左往右

  5. 返回值
    代码就直接写一个打家劫舍的函数,返回出两种分类结果的值,比较两次打家劫舍的返回值,返回大的值return max(nums[0]+rob1(nums,2,n-2),rob1(nums,1,n-1));

在这里插入图片描述

3.2 代码

class Solution {
public:int rob(vector<int>& nums) {int n = nums.size();if (n == 0)return 0;return max(nums[0]+rob1(nums,2,n-2),rob1(nums,1,n-1));     }int rob1(vector<int>& nums,int left,int right){if(left>right)return 0;int n = nums.size();vector<int> f(n);auto g = f;f[left] = nums[left];for (int i = left; i <=right; i++) {f[i] = g[i - 1] + nums[i];g[i] = max(f[i - 1], g[i - 1]);}return max(f[right], g[right]);}};

有问题请指出,大家一起进步!!!

这篇关于【OJ】动归练习四的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/856408

相关文章

RabbitMQ练习(AMQP 0-9-1 Overview)

1、What is AMQP 0-9-1 AMQP 0-9-1(高级消息队列协议)是一种网络协议,它允许遵从该协议的客户端(Publisher或者Consumer)应用程序与遵从该协议的消息中间件代理(Broker,如RabbitMQ)进行通信。 AMQP 0-9-1模型的核心概念包括消息发布者(producers/publisher)、消息(messages)、交换机(exchanges)、

【Rust练习】12.枚举

练习题来自:https://practice-zh.course.rs/compound-types/enum.html 1 // 修复错误enum Number {Zero,One,Two,}enum Number1 {Zero = 0,One,Two,}// C语言风格的枚举定义enum Number2 {Zero = 0.0,One = 1.0,Two = 2.0,}fn m

MySql 事务练习

事务(transaction) -- 事务 transaction-- 事务是一组操作的集合,是一个不可分割的工作单位,事务会将所有的操作作为一个整体一起向系统提交或撤销请求-- 事务的操作要么同时成功,要么同时失败-- MySql的事务默认是自动提交的,当执行一个DML语句,MySql会立即自动隐式提交事务-- 常见案例:银行转账-- 逻辑:A给B转账1000:1.查询

html css jquery选项卡 代码练习小项目

在学习 html 和 css jquery 结合使用的时候 做好是能尝试做一些简单的小功能,来提高自己的 逻辑能力,熟悉代码的编写语法 下面分享一段代码 使用html css jquery选项卡 代码练习 <div class="box"><dl class="tab"><dd class="active">手机</dd><dd>家电</dd><dd>服装</dd><dd>数码</dd><dd

014.Python爬虫系列_解析练习

我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈 入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈 虚 拟 环 境 搭 建 :👉👉 Python项目虚拟环境(超详细讲解) 👈👈 PyQt5 系 列 教 程:👉👉 Python GUI(PyQt5)文章合集 👈👈 Oracle数据库教程:👉👉 Oracle数据库文章合集 👈👈 优

如何快速练习键盘盲打

盲打是指在不看键盘的情况下进行打字,这样可以显著提高打字速度和效率。以下是一些练习盲打的方法: 熟悉键盘布局:首先,你需要熟悉键盘上的字母和符号的位置。可以通过键盘图或者键盘贴纸来帮助记忆。 使用在线打字练习工具:有许多在线的打字练习网站,如Typing.com、10FastFingers等,它们提供了不同难度的练习和测试。 练习基本键位:先从学习手指放在键盘上的“家位”开始,通常是左手的

anaconda3下的python编程练习-csv翻译器

相关理解和命令 一、环境配置1、conda命令2、pip命令3、python命令 二、开发思路三、开发步骤 一、环境配置 1、conda命令 镜像源配置 conda config --show channels //查看镜像源conda config --remove-key channels //删除添加源,恢复默认源#添加镜像源conda config --ad

推荐练习键盘盲打的网站

对于初学者来说,以下是一些推荐的在线打字练习网站: 打字侠:这是一个专业的在线打字练习平台,提供科学合理的课程设置和个性化学习计划,适合各个水平的用户。它还提供实时反馈和数据分析,帮助你提升打字速度和准确度。 dazidazi.com:这个网站提供了基础的打字练习,适合初学者从零开始学习打字。 Type.fun打字星球:提供了丰富的盲打课程和科学的打字课程设计,还有诗词歌赋、经典名著等多样

综合DHCP、ACL、NAT、Telnet和PPPoE进行网络设计练习

描述:企业内网和运营商网络如上图所示。 公网IP段:12.1.1.0/24。 内网IP段:192.168.1.0/24。 公网口PPPOE 拨号采用CHAP认证,用户名:admin 密码:Admin@123 财务PC 配置静态IP:192.168.1.8 R1使用模拟器中的AR201型号,作为交换路由一体机,下图的WAN口为E0/0/8口,可以在该接口下配置IP地址。 可以通过

JAVA学习-练习试用Java实现“删除有序数组中的重复项”

问题: 给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。 说明: 为什么返回数值是整数,但输出的答案是数组呢? 请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。 你可以想象内部操作如下