LeetCode 热题 100 | 动态规划(一)

目录

1  70. 爬楼梯

1.1  基本思路

1.2  官方题解

2  118. 杨辉三角

3  198. 打家劫舍


菜鸟做题,语言是 C++

1  70. 爬楼梯

核心思想:把总问题拆解为若干子问题。

  • 总问题:上到 5 楼的方式有多少种
  • 子问题:上到 4 楼的方式有多少种、上到 3 楼的方式有多少种
  • 总问题 = 子问题 1 + 子问题 2

因为题目要求每次只能爬 1 或 2 个台阶,所以子问题只有两个。

1.1  基本思路

假设按照英国算法要爬 6 层楼,如下图所示:

使用一个名为 dp 的数组来存储爬到每一层楼的方式种数。

由于我们只能从 4 或 3 楼爬到 5 楼,因此爬到 5 楼的方式种数 = 爬到 4 楼的方式种数 + 爬到 3 楼的方式种数,即 dp[5] = dp[4] + dp[3],以此类推。

特别地,对于 0 楼和 1 楼,由于只有一种方式爬到它们,因此直接设为 1 即可。

很不幸,上述方法需要维护一个长为 n 的数组 dp,因此空间复杂度是 O(n),而这样会超出内存限制,下面来看官方题解的奇妙方法。

1.2  官方题解

由 1.1 节的分析可知,dp[5] 只与 dp[4] 和 dp[3] 有关。因此在第 5 时刻,我们只需要记住 dp[4] 和 dp[3] 即可。换句话说,就是通过忘记其他 dp 元素来节省内存空间。

如下图所示。我们设置变量 p、q、r 来分别存储 dp[i - 2]、dp[i - 1]、dp[i],并不断更新这些变量。

可以把 p、q、r 理解为一个滑动窗口,每次同时向后移动一格,以此忘记不再需要的 dp 元素。 

完整代码如下:

class Solution {
public:
    int climbStairs(int n) {
        int p = 0, q = 0, r = 1;
        for (int i = 0; i < n; ++i) {
            p = q;
            q = r;
            r = p + q;
        }
        return r;
    }
};

这个启动方式还是挺妙的:

int p = 0, q = 0, r = 1;

2  118. 杨辉三角

核心思想:把总问题拆解为若干子问题。

  • 总问题:第 i 行第 j 列元素的值
  • 子问题:第 i - 1 行第 j 列元素的值、第 i - 1 行第 j + 1 列元素的值
  • 总问题 = 子问题 1 + 子问题 2

模仿上述动图初始化 ans 数组:

vector<vector<int>> ans(numRows);
for (int i = 1; i <= numRows; ++i) {
    ans[i - 1].resize(i);
    ans[i - 1][0] = 1;
    ans[i - 1][i - 1] = 1;
}

就是把那一圈 “1” 先填了,虽然笨,但貌似不影响效率。

完整代码如下:

class Solution {
public:
    vector<vector<int>> generate(int numRows) {

        vector<vector<int>> ans(numRows);
        for (int i = 1; i <= numRows; ++i) {
            ans[i - 1].resize(i);
            ans[i - 1][0] = 1;
            ans[i - 1][i - 1] = 1;
        }

        for (int i = 2; i < numRows; ++i) {
            for (int j = 1; j < ans[i].size() - 1; ++j) {
                ans[i][j] = ans[i - 1][j - 1] + ans[i - 1][j];
            }
        }

        return ans;
    }
};

3  198. 打家劫舍

核心思想:把总问题拆解为若干子问题。

  • 总问题:打劫完第 i 家所获最大金额
  • 子问题:打劫完第 i - 2 家所获最大金额、打劫完第 i - 3 家所获最大金额
  • 总问题 = 子问题 1 + 子问题 2

Q:为什么只考虑打劫第 i - 2 家和第 i - 3 家?

A:假设 i = 5,如下图所示。对于第 i - 1 家,由于不能打劫相邻的两家,因此要想打劫第 i 家,就不能打劫第 i - 1 家。可以打劫第 i - 2 家或者第 i - 3 家,如情况一和情况二所示。对于第 i - 4 家,由于要使金额最大,因此肯定还会打劫第 i - 2 家,从而认为情况一等价于情况三。

综上,我们只需要考虑情况一和情况二即可。

同  70. 爬楼梯  的简化思路相同,我们同样可以只设置几个变量来存储历史打劫金额,而非使用一个 dp 数组。其中,h3 存储第 i - 3 家,h2 存储第 i - 2 家,h1 存储第 i - 1 家,h0 存储第 i 家。

完整代码如下:

class Solution {
public:
    int rob(vector<int>& nums) {

        int h3 = 0, h2 = 0, h1 = 0;
        int ans = INT_MIN;
        for (int i = 0; i < nums.size(); ++i) {
            int h0 = max(nums[i] + h3, nums[i] + h2);
            ans  = max(ans, h0);
            h3 = h2;
            h2 = h1;
            h1 = h0;
        }
        return ans;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/512102.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

焦虑研究的实验设备——大小鼠高架十字迷宫KT-0856

高架十字迷宫是一种广泛应用于焦虑研究的实验设备&#xff0c;尤其适用于啮齿类动物如大鼠和小鼠。这种迷宫的设计基于啮齿类动物的自然探究行为&#xff0c;以及它们对于高悬敞开环境的恐惧。通过观察和量化动物在开臂和闭臂之间的行为选择&#xff0c;研究人员可以评估其焦虑…

逻辑回归(Logistic Regression)详解

逻辑回归&#xff08;Logistic Regression&#xff09;是一种常用的统计学习方法&#xff0c;用于解决二分类问题。虽然名字中包含“回归”&#xff0c;但逻辑回归实际上是一种分类算法&#xff0c;而不是回归算法。它的基本原理是使用逻辑函数&#xff08;也称为Sigmoid函数&a…

mysyl索引

图中一共分了三个部分&#xff1a; Index Key &#xff1a;MySQL是用来确定扫描的数据范围&#xff0c;实际就是可以利用到的MySQL索引部分&#xff0c;体现在Key Length。 Index Filter&#xff1a;MySQL用来确定哪些数据是可以用索引去过滤&#xff0c;在启用ICP后&#xff…

6、Cocos Creator 2D 渲染组件:​Sprite 组件​

Sprite 组件 Sprite&#xff08;精灵&#xff09;是 2D/3D 游戏最常见的显示图像的方式&#xff0c;在节点上添加 Sprite 组件&#xff0c;就可以在场景中显示项目资源中的图片。 属性功能说明Type渲染模式&#xff0c;包括普通&#xff08;Simple&#xff09;、九宫格&#x…

[C++]使用OpenCV去除面积较小的连通域

这是后期补充的部分&#xff0c;和前期的代码不太一样 效果图 源代码 //测试 void CCutImageVS2013Dlg::OnBnClickedTestButton1() {vector<vector<Point> > contours; //轮廓数组vector<Point2d> centers; //轮廓质心坐标 vector<vector<Point&…

深度学习理论基础(五)卷积神经网络CNN

目录 前述&#xff1a;卷积神经网络基础1.卷积网络流程2.卷积网络核心3.卷积下采样4.卷积上采样--转置卷积 一、卷积神经网络层1.卷积层&#xff08;1&#xff09;内部参数&#xff1a;卷积核权重&#xff08;2&#xff09;内部参数&#xff1a;偏置&#xff08;3&#xff09;外…

网络安全 | 什么是DDoS攻击?

关注WX&#xff1a;CodingTechWork DDoS-介绍 DoS&#xff1a;Denial of Service&#xff0c;拒绝服务。DDoS是通过大规模的网络流量使得正常流量不能访问受害者目标&#xff0c;是一种压垮性的网络攻击&#xff0c;而不是一种入侵手段。NTP网络时间协议&#xff0c;设备需要…

Kaggle:收入分类

先看一下数据的统计信息 import pandas as pd # 加载数据&#xff08;保留原路径&#xff0c;但在实际应用中建议使用相对路径或环境变量&#xff09; data pd.read_csv(r"C:\Users\11794\Desktop\收入分类\training.csv", encodingutf-8, encoding_errorsrepl…

HTML - 请你谈一谈img标签图片和background背景图片的区别

难度级别&#xff1a;中级及以上 提问概率&#xff1a;65% 面试官当然不会问如何使用img标签或者background来加载一张图片&#xff0c;这些知识点都很基础&#xff0c;相信只要从事前端开发一小段时间以后&#xff0c;就可以轻松搞定加载图片…

MFC通用静态库制作与使用

开发环境VS2013 1、新建工程&#xff0c;选择Win32 Project&#xff0c;命名&#xff0c;选择路径等 2、选择Static library &#xff0c;勾选MFC 3、点击完成。在工程中添加相应的头文件、源文件等通用功能函数或者类。 4、在其他工程引入使用。在使用的工程项目设置中Linker…

HarmonyOS 应用开发之通过数据管理服务实现数据共享静默访问

场景介绍 典型跨应用访问数据的用户场景下&#xff0c;数据提供方会存在多次被拉起的情况。 为了降低数据提供方拉起次数&#xff0c;提高访问速度&#xff0c;OpenHarmony提供了一种不拉起数据提供方直接访问数据库的方式&#xff0c;即静默数据访问。 静默数据访问通过数据…

基于Python+Tkinter实现一个贪食蛇小游戏

你是否还记得那个时代&#xff0c;当我们的手机还没有触摸屏&#xff0c;游戏也只有像“贪食蛇”这样的经典款&#xff1f;当时&#xff0c;许多人都沉迷于控制一条小蛇吃食物的乐趣中。而今&#xff0c;让我们利用Python和Tkinter&#xff0c;一起重温那个时代&#xff0c;制作…

程序汪10万接的多平台视频分发项目,模拟人工发视频

本项目来自程序汪背后的私活小团队&#xff0c;开发了一个多平台分发视频项目&#xff0c;给粉丝分享一下解决方案和具体项目分开情况付款情况等等细节&#xff0c;希望给想接私活的朋友一些经验参考 程序汪10万接的多平台视频分发项目&#xff0c;模拟人工发视频 视频版本 在 …

LabVIEW挖坑指南

一、挖坑指南 1.1、输出变量放在条件框内 错误写法&#xff1a; 现象&#xff1a;如果没进入对应的分支&#xff0c;输出为默认值 正常写法&#xff1a; 让每个分支输出的值都在预料之内。 1.2、统计耗时不准 错误写法 现象&#xff1a;统计出来的耗时是2000ms 正常写法&a…

redis发布订阅模式

需要两个终端。 首先我们打开第一个终端&#xff0c;使用SUBSCRIBE命令来订阅一个频道。 打开另一个终端&#xff0c;发布信息使用PUBLISH&#xff0c;后面加上频道的名称和消息的内容 返回去看第一个终端 订阅频道的终端可以有多个。但是订阅频道有一些局限性&#xff0c;比如…

【web】nginx+php-fpm云导航项目部署-(简版)

一、yum安装nginx yum -y install nginx 二、php环境安装 2.1 php安装 yum -y install php 2.2 php-fpm安装 yum -y install php-fpm 注&#xff1a;PHP在 5.3.3 之后已经讲php-fpm写入php源码核心了。 2.3 项目依赖的php-xml和php-xmlrpc安装 yum -y install php-…

展馆设计中融入数字化和智能化元素

一、多媒体技术的应用 展馆设计公司可以通过应用多媒体技术&#xff0c;为展馆创造一个数字化和互动式的环境。利用投影技术、触摸屏和交互式设备&#xff0c;可以实现展示内容的多样化和互动式展示。通过数字化的展示方式&#xff0c;观众可以更加深入地了解和体验展示内容&am…

【HTML】注册页面制作 案例二

&#xff08;大家好&#xff0c;今天我们将通过案例实战对之前学习过的HTML标签知识进行复习巩固&#xff0c;大家和我一起来吧&#xff0c;加油&#xff01;&#x1f495;&#xff09; 案例复习 通过综合案例&#xff0c;主要复习&#xff1a; 表格标签&#xff0c;可以让内容…

基于深度学习的危险物品检测系统(网页版+YOLOv8/v7/v6/v5代码+训练数据集)

摘要&#xff1a;本文详细介绍基于YOLOv8/v7/v6/v5的危险物品检测技术。主要采用YOLOv8技术并整合了YOLOv7、YOLOv6、YOLOv5的算法&#xff0c;进行了细致的性能指标对比分析。博客详细介绍了国内外在危险物品检测方面的研究现状、数据集处理方法、算法原理、模型构建与训练代码…

3D打印模型检查清单

创建 3D 打印模型一开始可能会有些令人生畏。 在这篇博文中&#xff0c;我们将介绍设计师应牢记的一些基本技巧&#xff0c;以获得令人惊叹的 3D 打印效果。 遵守此清单将确保你的 3D 模型为 3D 打印做好充分准备。 1、水密/非流形 可打印模型的表面不得有任何孔。 问自己一个…