【LeetCode】动态规划 刷题训练(一)

news2024/9/21 22:37:43

文章目录

  • 面试题 08.01. 三步问题
    • 题目解析
    • 状态转移方程
    • 完整代码
  • 746. 使用最小花费爬楼梯
    • 题目解析
    • 状态转移方程
    • 完整代码
  • 91. 解码方法
    • 题目解析
    • 状态转移方程
      • 情况1:让i位置的数,单独去解码
      • 情况2:让i位置的数 和i-1位置的数 结合 一起去解码
    • 完整代码

面试题 08.01. 三步问题

点击查看: 三步问题

三步问题。有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶、2阶或3阶。实现一种方法,计算小孩有多少种上楼梯的方式。结果可能很大,你需要对结果模1000000007。

示例1:
输入:n = 3
输出:4
说明: 有四种走法
示例2:
输入:n = 5
输出:13

题目解析

当n==1时
只能从 0走到1 ,即0->1 , 所以只有1 种方法

当n==2时
可以从 0->2 ,有1种 方法
可以从 1->2 , 而0到1 只有1种方法,而1到2只需加一步,所以有2种方法
最终 1+1 ,共有2种方法

当n==3时
从0->3 有1种方法
从1->3 ,因为0->1只有1种方法,而1到3只需加一步 ,所以 有1种方法
从2->3,因为0->2有2种方法 ,而2到3只需加一步,所以有2种方法
最终 1+1+2 ,共有 4种方法

当n==4时
因为 最多一次 走 3步,所以 0->4 不成立
从1->4,因为0->1 有1种方法,而1到4只需加一步,所以有1种方法
从2->4,因为0->2 有2种方法,而2到4只需加一步,所以有2种方法
从3->4,因为0->3有3种方法,而3到4只需加一步,所以有3种方法
最终 1+2+3, 共有7种方法


状态转移方程

以i位置为结尾
dp[i]代表到达i位置时,共有多少种方法


状态转移方程
以 i 位置的状态,最近的一步划分问题

dp[i]分三种情况考虑,
从i-1位置到i位置 即dp[i-1]
从i-2位置到i位置 即dp[i-2]
从i-3位置到i位置 即dp[i-3]

dp[i]= dp[i-1]+dp[i-2]+dp[i-3]

完整代码

class Solution {
public:
    int waysToStep(int n) {
    if(n==1||n==2)
    {
        return n;
    }
    if(n==3)
    {
        return 4;
    }
    vector<int>dp(n+1);
    
    dp[1]=1;
    dp[2]=2;
    dp[3]=4;
    int i=0;
    for(i=4;i<=n;i++)
    {
        dp[i]=( (dp[i-1]+dp[i-2])%1000000007+dp[i-3])%1000000007;
    }
    return  dp[n];
    }
};

在计算状态转移方程时,不能将三个加一起后在取模 ,否则会报错
在 dp[i-1] 与dp[i-2] 相加时就需要取模,然后与dp[i-3]相加时 再取模


746. 使用最小花费爬楼梯

点击查看:使用最小花费爬楼梯

给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。
你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。
请你计算并返回达到楼梯顶部的最低花费。

示例 1:
输入:cost = [10,15,20]
输出:15
解释:你将从下标为 1 的台阶开始。
支付 15 ,向上爬两个台阶,到达楼梯顶部。
总花费为 15 。

题目解析

在这里插入图片描述
从下标0处开始,可以花费10块 到下标为1处 ,也可以到下标为2处
但是 下标为2处并不是 楼顶,因为此处若为楼顶的话,则最小花费应为10,而不是15 ,
所以楼顶为 cost 数组 最后一个元素的下一个


从下标为1的位置开始,可以到下标为2处,也可以到楼顶处

状态转移方程

dp[i] 代表 达到 i 位置时 的最小花费
而i位置 的最小花费,又是 通过 i-1位置 的最小花费 和 i-2位置的最小花费 综合的最小花费 而得来的


dp[i] 可以分为

1. 先达到i-1位置,支付coost[i-1],走一步
dp[i-1]代表 达到i-1位置的最小花费 ,cost[i-1]代表 i-1位置所需费用
dp[i-1]+cost[i-1]

2. 先达到 i-2位置,支付cost[i-2], 走两步
dp[i-2]代表 达到i-2位置的最小花费 ,cost[i-2]代表 i-2位置所需费用
dp[i-2]+cost[i-2]

动态转移方程
dp[i]= min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]);

完整代码

class Solution {
public:
    int minCostClimbingStairs(vector<int>& cost) {
      vector<int>dp(cost.size()+1,0);
      dp[0]=0;
      dp[1]=0;
      int i=0;
      for(i=2;i<cost.size()+1;i++)
      {
          dp[i]=min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]);
      }
      return dp[cost.size()];
    }
};

对于状态转移方程,下标为0和下标为1的位置是没办法使用的,会造成越界
题中说可以选择从0或者1位置开始爬楼梯 代表两个位置是没有花费的
dp[0] =0 ,dp[1]=0

91. 解码方法

点击查看:解码方法

一条包含字母 A-Z 的消息通过以下映射进行了 编码 :
‘A’ -> “1”
‘B’ -> “2”
‘Z’ -> “26”
要 解码 已编码的消息,所有数字必须基于上述映射的方法,反向映射回字母(可能有多种方法)。例如,“11106” 可以映射为:
“AAJF” ,将消息分组为 (1 1 10 6)
“KJF” ,将消息分组为 (11 10 6)
注意,消息不能分组为 (1 11 06) ,因为 “06” 不能映射为 “F” ,这是由于 “6” 和 “06” 在映射中并不等价。
给你一个只含数字的 非空 字符串 s ,请计算并返回 解码 方法的 总数 。
题目数据保证答案肯定是一个 32 位 的整数。

示例 1:
输入:s = “12”
输出:2
解释:它可以解码为 “AB”(1 2)或者 “L”(12)。

示例 3:
输入:s = “06”
输出:0
解释:“06” 无法映射到 “F” ,因为存在前导零(“6” 和 “06” 并不等价)。

题目解析

若将其 分为1和2,则 分别对应 A和B
若 将其看作一个整体,则 对应为L


若将其分为0和6,则0没有对应字母
若将其 看作一个整体,不允许 存在前导0 表示

状态转移方程

dp[i] 表示 以i位置为结尾时,解码方法的总数

情况1:让i位置的数,单独去解码

单独解码的数 需要在1-9,所以会存在 成功/失败的情况

若解码成功,则i位置对应的数字 为1-9之间,相当于把0到i-1位置的所有解码方案 后面加上一个字符,
整体解码的数量就为以i-1位置结尾的数量 即dp[i-1]

若解码失败,则全部失败 ,解码数为0
如: 60 单独计算,6为F,而0不存在 对应数, 所以没有解码成功

情况2:让i位置的数 和i-1位置的数 结合 一起去解码

若解码成功,则结合的数字 为 10-26之间,相当于在0到i-2位置的所有解码方案 后面加上一个字符,
整体解码的数量就为 以i-2结尾的的数量 即dp[i-2]

若解码失败,则全部失败 ,解码数为0


dp[i]=dp[i-1]+dp[i-2]
dp[i-1] 和dp[i-2]只有在解码成功时,才会加上,否则为0

完整代码

class Solution {
public:
    int numDecodings(string s) {
       vector<int>dp(s.size());
        int i=0;

        //初始化
        if(s[0]!='0')
        {
            dp[0]=1;
        }
        else 
        {
            dp[0]=0;
        }
        
        //有可能s字符串只有一个数字 
        if(s.size()==1)
        {
            return dp[0];
        }

       if(s[0]!='0'&&s[1]!='0')
       {
           dp[1]++;
       }
       //因为s[0]存的是字符,所以选哟减去'0',从而获取数字
       int sum=(s[0]-'0')*10+(s[1]-'0');
       if(sum>=10&&sum<=26)
       {
           dp[1]++;
       }

        for(i=2;i<s.size();i++)
        {
            //说明可以单独编码成功
           if(s[i]!='0')
           {
             dp[i]+=dp[i-1];
           }

             //说明可以结合编码成功
            int sum=(s[i-1]-'0')*10+(s[i]-'0');
         
            if(sum>=10&&sum<=26)
            {
                dp[i]+=dp[i-2];
            }

        }
        return dp[s.size()-1];
    }
};

初始化
dp[0] 表示 只有一个数字
若数字 处于1-9之间,则解码成功,返回1
若数字 为0,则解码失败 ,返回0

dp[1] 表示 两个数字
可以分为 两个数字 单独解码 和 结合起来解码

若 单独解码 成功,则解码数+1,否则为0
若结合起来解码 成功,则解码数+1,否则为0
所以有 0 1 2 三种情况

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

安全合规进入场景细分时代

2022年6月1日&#xff0c;《中华人民共和国网络安全法》&#xff08;以下简称《网络安全法》&#xff09;正式实施迎来5周年。 作为国家实施网络空间管辖的第一部法律&#xff0c;《网络安全法》标志着我国网络安全工作有了基础性的法律框架&#xff0c;意味着建设网络强国的制…

chatgpt赋能python:Python清空:如何在Python中使用清空来删除变量和数据结构中的所有元素

Python清空&#xff1a;如何在Python中使用清空来删除变量和数据结构中的所有元素 在Python编程中&#xff0c;我们常常需要删除变量和数据结构中的元素。Python提供了多种方法来实现这一点&#xff0c;其中最常用的方法之一就是使用清空功能。在本文中&#xff0c;我们将介绍…

【期末总复习】机器学习(公式推导与代码实现)鲁伟

【第一章】机器学习预备知识 1、了解机器学习的发展简史 2、复述出训练集、验证集和测试集的作用 训练集&#xff08;Training set&#xff09; 作用是用来拟合模型&#xff0c;通过设置分类器的参数&#xff0c;训练分类模型。后续结合验证集作用时&#xff0c;会选出同一参…

chatgpt赋能python:Python教程:求反向位置的字母

Python教程&#xff1a;求反向位置的字母 在这篇文章中&#xff0c;我们将介绍如何使用Python编程语言来找到给定字符串中的反向位置的字母。这是一个有趣的编程问题&#xff0c;特别是对于那些喜欢解决有趣问题的人来说&#xff0c;同时本文也将从SEO的角度来讲解如何优化文本…

LNMP搭建

一、编译安装nginx1.1 关闭防火墙&#xff0c;将安装nginx所需软件包传到/opt目录下并解压1.2 安装依赖包1.3 创建运行用户与组1.4 编译安装Nginx1.5 检查配置文件是否配置正确&#xff0c;并启动nginx服务 二、安装 MySQL 服务2.1 安装Mysql环境依赖包2.2 创建运行用户2.3 编译…

前端Vue自定义简单好用商品分类列表组件 侧边栏商品分类组件

前端Vue自定义简单好用商品分类列表组件 侧边栏商品分类组件 &#xff0c; 下载完整代码请访问uni-app插件市场地址&#xff1a;https://ext.dcloud.net.cn/plugin?id13148 效果图如下&#xff1a; # cc-defineCateList #### 使用方法 使用方法 <!-- data:商品列表数组…

C专家编程 —— 链接的思考

文章目录 编译器的作用动态链接和静态链接动态链接动态链接的优点 函数库链接的几个小秘密 编译器的作用 通常编译器被氛围六七个小的程序&#xff1a; C预处理器&#xff0c;得到main.i文件前端做语法语义分析&#xff0c;然后后端生成汇编的指令代码main.s文件优化器可以放…

Java-API简析_java.lang.SecurityManager类(基于 Latest JDK)(浅析源码)

【版权声明】未经博主同意&#xff0c;谢绝转载&#xff01;&#xff08;请尊重原创&#xff0c;博主保留追究权&#xff09; https://blog.csdn.net/m0_69908381/article/details/131346082 出自【进步*于辰的博客】 其实我的【Java-API】专栏内的博文对大家来说意义是不大的。…

【Python 基础篇】Python学生管理系统

文章目录 引言一、系统设计与功能分析二、系统设计与实现三、系统应用示例四、总结 引言 学生管理系统是一个常见的应用程序&#xff0c;它可以帮助学校、教育机构或教师管理学生的信息。本文将介绍如何使用面向对象编程思想&#xff0c;利用Python开发一个学生管理系统。系统…

源码编译 DolphinScheduler 1.3.9 海豚调度,修改Hadoop、Hive组件版本兼容

大前提&#xff1a; maven3 jdk8 环境 maven 私服换成国内镜像&#xff0c;推荐阿里云 maven 镜像 maven-3.6.3\conf\settings.xml <mirrors><mirror><id>aliyunmaven</id><mirrorOf>*</mirrorOf><name>阿里云公共仓库</name&g…

Android 13(T) - binder阅读(1)- binder driver

1 总览 想要使用binder完成进程间通信&#xff08;IPC&#xff09;或者完成远程过程调用&#xff08;RPC&#xff09;&#xff0c;那么我们需要有如下三个要素&#xff1a; 源&#xff1a;即调用者&#xff08;Client&#xff09;目的&#xff1a;即服务提供者&#xff08;Se…

win10 64位系统下载、安装nodejs(图文教程)

windows电脑下载、安装nodejs是很容易的&#xff0c;参考下面的图文教程&#xff0c;很快就能搞定下载安装. 1&#xff0c;下载nodejs 下载地址&#xff1a;https://nodejs.org/en/download/ 2&#xff0c;安装nodejs 点击安装包&#xff0c;一路下一步 3&#xff0c;验证…

设计模式—责任链模式

一、待解决问题&#xff1a; 减少代码中 if else 语句&#xff0c;降低代码圈复杂度或深度&#xff0c;增强可读性。 1、需求背景&#xff1a; 采购订单创建&#xff0c;需要验证采购员、物料、供应商、供应商的银行账号等信息。如采购员权限到期、或供应商失效等问题&#xff…

python机器学习——机器学习相关概念 特征工程

目录 机器学习特征工程1.特征抽取2.特征处理2.1 归一化&#xff1a;传统精确小数据2.2 标准化&#xff1a;大多数情况 3.数据降维3.1特征选择3.2主成分分析PCA 案例&#xff1a;超市订单分析 机器学习 监督学习&#xff1a;输入数据有特征有标签&#xff0c;即有标准答案 分类&…

chatgpt赋能python:Python求累加求和指南

Python求累加求和指南 Python是一种简单而强大的编程语言&#xff0c;从事编程工作的人大多都对它有一定的了解。它具有开发复杂应用程序的强大功能&#xff0c;同时也可以被用作数据处理和分析等用途。其中一个最常见的任务就是累加求和&#xff0c;今天我们将介绍如何在Pyth…

Redis 集合相关命令

Redis 支持多种数据结构&#xff0c;比如 字符串、列表、集合、有序集合 和 哈希 等数据结构。本次我整理了关于 集合 相关的命令&#xff0c;也就是关于 Sets 相关的命令&#xff0c;如下图。 上图中用红色圈中的部分&#xff0c;就是关于 集合 相关的命令。如果想要在 Redis …

JDBC小记——基础入门

目录 JDBC概念 JDBC入门 1. 导入数据库的驱动jar包 2. 加载驱动jar包 3. 获取连接对象 4. 获取操作对象 5.执行SQL语句 6.释放资源 IDEA连接数据库 结果集对象 登录练习 JDBC概念 Java DataBase Connectivity 即 Java数据库连接 JDBC&#xff0c;其实就是Java定义…

第7章 Scala集合

第7章 Scala集合 7.1 简介 ​ ​ scala.collection.immutable ​ scala.collection.mutable ​ 7.2 数组 ​ 不可变数组 package chapter07object Test01_ImmutableArray {def main(args: Array[String]): Unit {// 1. 创建数组val arr: Array[Int] new Array[Int](10…

【AUTOSAR】AUTOSAR开发工具链(二)----TASKING库的封装

1、集成工程 步骤&#xff1a; 拷贝模块代码&#xff1a; 将源工程的所有模块代码拷贝到库工程&#xff0c;将源工程拷贝一份&#xff0c;并删除不必要的文件作为释放工程&#xff0c;完成结果如下图&#xff1a; 源工程&#xff08;左&#xff09;VS库工程&#xff08;中&am…

[CUDA][Ubuntu]如何卸载cuda和cudnn和nvidia driver

百度有很多牛鬼蛇神的办法&#xff0c;试了一晚上&#xff0c;都不行。 包括&#xff1a;通过安装方式卸载&#xff0c;我tm根本不知道当初这个机器是怎么安装的cuda&#xff0c;我怎么卸载&#xff1f;&#xff1f;&#xff1f; 通过删除文件夹和自带uninstall程序&#xff…