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

蓝桥杯刷题-day5-动态规划

文章目录

    • 使用最小花费爬楼梯
    • 解码方法

使用最小花费爬楼梯

【题目描述】
给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。

你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。

请你计算并返回达到楼梯顶部的最低花费。

【输入样例】

cost = [10,15,20]
cost = [1,100,1,1,1,100,1,1,100,1]

【输出样例】

15
6

【数据规模与约定】

  • 2 <= cost.length <= 1000
  • 0 <= cost[i] <= 999

【解题思路】
定义一个数组 dp,其中 dp[i] 表示达到第 i 个台阶的最低花费。

对于第 i 个台阶,我们有两种选择:

  1. 从第 i-1 个台阶向上爬一个台阶,花费为 dp[i-1] + cost[i-1]。
  2. 从第 i-2 个台阶向上爬两个台阶,花费为 dp[i-2] + cost[i-2]。

我们选择这两种方案中花费较小的那个,即 dpi = min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2])。

最终,dp[n] 就是达到楼梯顶部的最低花费。

【C++程序代码】
解法一

class Solution {
public:int minCostClimbingStairs(vector<int>& cost) {//1.创建dp表int n = cost.size();vector<int> dp(n+1);//2.初始化dp[0] = dp[1] = 0;if(n <2) return 0;//3.填表for(int i = 2;i<n+1;i++){dp[i] = min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]);}//4.返回值return dp[n];}
};

解法二

class Solution {
public:int minCostClimbingStairs(vector<int>& cost) {//1.创建dp表int n = cost.size();vector<int> dp(n);//2.初始化dp[n-2] = cost[n-2];dp[n-1] = cost[n-1];//3.填表for(int i = n-3;i>=0;i--){dp[i] = min(dp[i+1]+cost[i],dp[i+2]+cost[i]);}//4.返回值return min(dp[0],dp[1]);}
};

解码方法

【题目描述】
一条包含字母 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 位 的整数。

【输入样例】

s = "12"
s = "06"

【输出样例】

2
0

【数据规模与约定】

  • 1 <= s.length <= 100
  • s 只包含数字,并且可能包含前导零。

【解题思路】
定义一个数组 dp,其中 dp[i] 表示前 i 个字符可以解码的方法总数。
对于第 i 个字符,我们有两种选择:

  1. 将其作为单独的一个字母进行解码,前提是第 i 个字符不为 ‘0’。在这种情况下,我们可以将前 i-1 个字符解码的方法数加到 dp[i]上,即 dp[i] += dp[i-1]。
  2. 将其与前一个字符一起解码,形成一个两位数。前提是第 i-1 个字符不为 ‘0’,且与第 i 个字符组成的两位数在 10 到 26 之间。在这种情况下,我们可以将前 i-2 个字符解码的方法数加到 dpi 上,即 dp[i] += dp[i-2]。

最终,dp[n-1] 就是整个字符串的解码方法总数。

【C++程序代码】

class Solution {
public:int numDecodings(string s) {int n = s.size();vector<int> dp(n);// 处理第一个字符dp[0] = s[0] != '0';if(n==1)return dp[0];// 处理前两个字符if(s[0]!='0' && s[1]!='0')dp[1]++;int t = (s[0]-'0')*10 + (s[1]-'0');if(t>=10 && t<=26)dp[1]++;// 从第三个字符开始遍历for(int i = 2;i<n;i++){// 将当前字符作为单独的一个字母解码if(s[i] != '0')dp[i] += dp[i-1];// 将当前字符与前一个字符一起解码t = (s[i-1]-'0')*10 + (s[i]-'0');if(t>=10 && t<=26)dp[i] += dp[i-2];}return dp[n-1];}
};

相关文章:

  • Chrome 插件打包发布
  • 单元测试框架 Junit
  • 本地项目连接gitee仓库
  • sheng的学习笔记-AI-人脸识别
  • 把本地文件上传到HDFS上操作步骤
  • 详细剖析多线程2----线程安全问题(面试高频考点)
  • 基于单片机工业生产现场的光照强度控制系统设计
  • 2024/3/26 C++作业
  • Leo赠书活动-21期 《一篇讲明白 Hadoop 生态的三大部件》
  • dubbo 源码系列之-集群三板斧---负载均衡(二)
  • 哈工大 sse C语言 困难
  • Docker安装各种组件
  • 上位机图像处理和嵌入式模块部署(qmacvisual之ROI设定)
  • 第十一章:位运算符与位运算
  • ABC346 A-G 题解
  • [译]前端离线指南(上)
  • Android Volley源码解析
  • Debian下无root权限使用Python访问Oracle
  • Django 博客开发教程 8 - 博客文章详情页
  • dva中组件的懒加载
  • Electron入门介绍
  • Git初体验
  • Java IO学习笔记一
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • vue脚手架vue-cli
  • vue学习系列(二)vue-cli
  • 百度小程序遇到的问题
  • 笨办法学C 练习34:动态数组
  • 如何胜任知名企业的商业数据分析师?
  • 删除表内多余的重复数据
  • 一个JAVA程序员成长之路分享
  • postgresql行列转换函数
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • #、%和$符号在OGNL表达式中经常出现
  • (1)常见O(n^2)排序算法解析
  • (2.2w字)前端单元测试之Jest详解篇
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (二十四)Flask之flask-session组件
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (十) 初识 Docker file
  • (算法设计与分析)第一章算法概述-习题
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • (转) RFS+AutoItLibrary测试web对话框
  • (转)Scala的“=”符号简介
  • *setTimeout实现text输入在用户停顿时才调用事件!*
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .NET 8.0 发布到 IIS
  • .Net的DataSet直接与SQL2005交互
  • .NET精简框架的“无法找到资源程序集”异常释疑
  • .NET开源的一个小而快并且功能强大的 Windows 动态桌面软件 - DreamScene2
  • .NET下ASPX编程的几个小问题
  • [ 常用工具篇 ] POC-bomber 漏洞检测工具安装及使用详解