【算法训练记录——Day38】

Day38——动态规划Ⅰ

  • 1.理论
  • #2.leetcode_509斐波那契数
  • 3.leetcode_70爬楼梯
  • 4.kamacoder_57爬楼梯
  • 5.leetcode_746使用最小花费爬楼梯

1.理论

一般解题步骤:

  1. 确定dp数组及下标含义
  2. 确定递推公式
  3. 数组如何初始化
  4. 确定递归顺序
  5. 举例推导dp数组

#2.leetcode_509斐波那契数

在这里插入图片描述
思路:1. 递归
2. 动态规划的方式考虑5个问题:
1. dp数组及下标的含义: 第i个数的斐波那契数值是dp[i]
2. 递推公式:f[i] = f[i-1] + f[i-2];
3. 数组如何初始化:因为递推公式用到了i-1 i-2,因此初始化0,1位置
4. 确定递归顺序:
5. 举例推导递推公式 dp[i] = dp[i-1] + dp[i-2];

	int fib(int n) {if(n < 2) return n;vector<int> dp(n+1); // 第n个数的斐波那契数列值是dp[n],因此最少n+1个元素dp[0] = 0;dp[1] = 1;for(int i = 2; i <= n; i++) {dp[i] = dp[i-1] + dp[i-2]; // 根据递归公式推导}return dp[n];}

优化下:

	int fib(int n) {if(n < 2) return n;int dp[2] = {0};dp[0] = 0;dp[1] = 1;for(int i = 2; i <= n; i++) {dp[1] = dp[1] + dp[0];dp[0] = dp[1] - dp[0];}return dp[1];}

3.leetcode_70爬楼梯

在这里插入图片描述
思路:熟悉一下动态规划5步:
1. 确定动态规划数组及下标含义:爬 i 阶的楼梯共有 dp[i] 种爬法, i > 0
2. 确定递推公式: f(i) = f(i-2) + 2; 每次可以爬1~2个,这里每次只有两种爬法,1+1 / 2
3. 数组如何初始化:至少需要知道 i-2 > 0 的爬法有多少种, 初始化 dp[0], dp[1];
4. 确定递推顺序:从前向后
5. 举例推导 dp 数组: dp[i] = dp[i-2] + 2; (i >= 2)
写了一下,答案错误,感觉模拟的没问题,应该是递推公式有误,虽然只有两种爬法,但没有考虑如果是3,既可以先爬一步再爬两步,也可以先爬两步再爬一步。。确定递推公式时,如果爬两个一步,那不就是 i - 1的爬法吗,如果爬两步那就是i - 2的爬法,所以应该是 f(i) = f(i-1) + f(i-2);

	int climbStairs(int n) {int dp[2];dp[0] = 1;dp[1] = 1;for(int i = 2; i <= n; i++) {dp[1] += dp[0];dp[0] = dp[1] - dp[0];}return dp[1];}

4.kamacoder_57爬楼梯

在这里插入图片描述
思路:

  1. 确定动态规划数组及下标含义:爬 n 阶楼梯共有 dp[n] 种方法
  2. 确定递推公式:f(n) = f(n-1) + f(n-2) + … + f(n-m)
  3. 数组如何初始化: dp[0] = 1
  4. 确定顺序:从前向后
  5. 举例推导 dp 数组: dp[i] = dp[i-1] + … + dp[i-m];
	#include <iostream>
#include <vector>using namespace std;int main(){int n, m;cin >> n >> m;vector<int> dp(n + 1, 0);dp[0] = 1;for(int i = 1; i <= n; i++) {for(int j = 1; j <= m; j++) {// cout << i << " " << j << " ";if(i >= j) {dp[i] += dp[i-j];// cout << dp[i] << " " << dp[i-j];}// cout << endl;}}cout << dp[n];return 0;
}

5.leetcode_746使用最小花费爬楼梯

在这里插入图片描述
思路:

  1. 确定动态规划数组及下标含义:从 n 阶楼梯爬到顶最少花费 dp[n]
  2. 确定递推公式:f(n) = min(f(n-1),f(n-2));
  3. 数组如何初始化: dp[n] = cost[n], dp[n-1] = cost[n-1];
  4. 确定顺序:从后向前,从已知到未知
  5. 举例推导 dp 数组: dp[n] = min(dp[n+1], dp[n+2]) + cost[n];
	int minCostClimbingStairs(vector<int>& cost) {int dp[2];int size = cost.size();dp[1] = cost[size - 1];dp[0] = cost[size - 2];for(int i = size - 3; i >= 0; i--) {int tmp = dp[0];dp[0] = min(tmp, dp[1]) + cost[i];dp[1] = tmp;}return min(dp[0], dp[1]);}

题解方法二:

	int minCostClimbingStairs(vector<int>& cost) {int dp0 = 0;int dp1 = 0;for (int i = 2; i <= cost.size(); i++) {int dpi = min(dp1 + cost[i - 1], dp0 + cost[i - 2]);dp0 = dp1; // 记录一下前两位dp1 = dpi;}return dp1;}

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

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

相关文章

阿里云物联网应用层开发:第一部分,项目简介

文章目录 1、物联网应用层简介2、阿里云物联网应用层开发例程主要内容3、需要掌握基础知识 1、物联网应用层简介 应用层是物联网系统的用户界面&#xff0c;它提供了用户与系统交互的接口&#xff0c;这一层是将网络传输层的数据结果以易于理解和使用的方式呈现给用户&#xf…

linux虚拟机部署的MySQL如何使用外网访问?教你轻松使用cpolar在centos搭建内网穿透

文章目录 写在前面实现Linux的内网穿透1、官网账号注册2、在Linux部署我们自己的项目3、一键自动下载安装cpolar4、设置自己的token5、启动cpolar服务6、MySQL穿透测试 卸载方法 写在前面 相信很多小伙伴在本地搭建了一个MySQL数据库&#xff0c;想让其他同事或者合作者一起使…

BCFtools安装

记得之前安装这个软件的时候是非常简单的&#xff0c;但是今天重新安装的时候出现了很多的麻烦&#xff0c;想想还是做个记录吧! bcftools的下载地址如下&#xff1a; Releases samtools/bcftools (github.com)https://github.com/samtools/bcftools/releases/这里我们选用的…

【数据结构】(C语言):队列

队列&#xff1a; 线性的集合。先进先出&#xff08;FIFO&#xff0c;first in first out&#xff09;。两个指针&#xff1a;头指针&#xff08;指向第一个进入且第一个出去的元素&#xff09;&#xff0c;尾指针&#xff08;指向最后一个进入且最后一个出去的元素&#xff0…

Linux CentOS 7 离线安装.NET环境

下载 下载.NET 例如&#xff1a; aspnetcore-runtime-6.0.15-linux-x64.tar.gz 复制 复制到如下目录&#xff1a; /usr/local/dotnet/aspnetcore-runtime-6.0.15-linux-x64.tar.gz 解压 cd /usr/local/dotnet/ tar -zxvf aspnetcore-runtime-6.0.15-linux-x64.tar.gz 创建…

Linux开发讲课29---Linux USB 设备驱动模型

Linux 内核源码&#xff1a;include\linux\usb.h Linux 内核源码&#xff1a;drivers\hid\usbhid\usbmouse.c 1. BUS/DEV/DRV 模型 "USB 接口"是逻辑上的 USB 设备&#xff0c;编写的 usb_driver 驱动程序&#xff0c;支持的是"USB 接口"&#xff1a; US…

http.cookiejar.LoadError: Cookies file must be Netscape formatted,not JSON.解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

从直播消息中找到对应的proto协议内容

这么多直播间的消息&#xff0c;我们该怎么从里面找到我们需要的消息定义呢&#xff1f; 其实只要你能找到这个里面的this对象&#xff0c;就可以看到这个对象上面有一个root > webcast > im 这里面的函数就都是用于解析直播间消息的函数&#xff1a; 想要看一下每个消息…

短信API的集成过程步骤?有哪些注意事项?

短信API的安全性如何保障&#xff1f;怎么优化API接口的性能&#xff1f; 在现代通信和业务流程中&#xff0c;短信API的使用变得越来越普遍。短信API为企业提供了一种高效、可靠的方式来向客户发送信息。AoKSend将详细介绍短信API的集成过程步骤&#xff0c;帮助企业顺利实施…

2024.07使用gradle上传maven组件到central.sonatype,非常简单

本文基于sonatypeUploader2.0版本 在1.0版本我们还需要手动去添加maven-publish和signing插件&#xff0c;在2.0版本他已经内置了&#xff0c;如果你仍然需要手动配置&#xff0c;你可以手动添加这两个插件及逻辑。 具体信息参考开源仓库&#xff1a; 插件仓库&#xff1a;h…

一个时代的结束:Centos7将在6月30日退出历史舞台

友情提醒&#xff1a; 如果你使用的是曾经辉煌一时的CentOS Linux 7&#xff0c;一直拖延没有迁移&#xff0c;那么现在距离它正式寿终正寝还有不到一周的时间。 CentOS Linux 7 的结束日期仍定在2024年6月30日。红帽早在 2020 年就做出了有争议的举动&#xff0c;将重点转移到…

【人工智能学习之图像操作(一)】

【人工智能学习之图像操作&#xff08;一&#xff09;】 图像读写创建图片并保存视频读取色彩空间与转换色彩空间的转换通道分离理解HSV基本图形绘制 阀值操作OTSU二值化简单阀值自适应阀值 图像读写 图像的读取、显示与保存 import cv2 img cv2.imread(r"1.jpg")…

面试突击:ConcurrentHashMap 源码详解

本文已收录于&#xff1a;https://github.com/danmuking/all-in-one&#xff08;持续更新&#xff09; 前言 哈喽&#xff0c;大家好&#xff0c;我是 DanMu。这篇文章想和大家聊聊 ConcurrentHashMap 相关的知识点。严格来说&#xff0c;ConcurrentHashMap 属于java.lang.cur…

springboot+vue 开发记录(八) 前端项目打包

本篇文章涉及到前端项目打包的一些说明 我打包后的项目在部署到服务器上后&#xff0c;访问页面时按下F12出现了这种情况&#xff1a; 它显示出了我的源码&#xff0c;这是一种很不安全的行为 该怎么办&#xff1f;很简单&#xff1a; 我们只需要下载一点点插件&#xff0c;再…

鸿蒙开发Ability Kit(程序框架服务):【声明权限】

声明权限 应用在申请权限时&#xff0c;需要在项目的配置文件中&#xff0c;逐个声明需要的权限&#xff0c;否则应用将无法获取授权。 在配置文件中声明权限 应用需要在module.json5配置文件的[requestPermissions]标签中声明权限。 属性说明取值范围name必须&#xff0c;…

Python中爬虫编程的常见问题及解决方案

Python中爬虫编程的常见问题及解决方案 引言&#xff1a; 随着互联网的发展&#xff0c;网络数据的重要性日益突出。爬虫编程成为大数据分析、网络安全等领域中必备的技能。然而&#xff0c;爬虫编程不仅需要良好的编程基础&#xff0c;还需要面对着各种常见的问题。本文将介绍…

服装分销的系统架构

背景 服装的分销规则&#xff1a;组织结构由总公司代理商专卖店构成。总公司全权负责销售业务&#xff0c;并决定给代理商的份额&#xff1b;代理商再给货到专卖店&#xff0c;整个组织机构呈现树状结构&#xff1b;上级机构对下级机构拥有控制权&#xff0c;主要控制其销售的服…

LCD 显示--lvds

作者简介&#xff1a; 一个平凡而乐于分享的小比特&#xff0c;中南民族大学通信工程专业研究生在读&#xff0c;研究方向无线联邦学习 擅长领域&#xff1a;驱动开发&#xff0c;嵌入式软件开发&#xff0c;BSP开发 作者主页&#xff1a;一个平凡而乐于分享的小比特的个人主页…

鸿蒙生态应用开发白皮书V3.0

来源&#xff1a;华为&#xff1a; 近期历史回顾&#xff1a;

鸿蒙:this传递参数到子组件中无法实现

this指代当前组件的某个变量&#xff0c;当把这个变量当作参数传递给子组件时&#xff0c;子组件中没有这个变量&#xff0c;属于使用不了这个变量 解决方法&#xff1a;在变量后面加.bind(this)将当前组件的变量一起绑定过去