DP第一天:力扣● 理论基础 ● 509. 斐波那契数 ● 70. 爬楼梯 ● 746. 使用最小花费爬楼梯

● 理论基础

DP大约五种问题:

动规基础(斐波那契数列、爬楼梯);背包问题;股票问题;打家劫舍;子序列问题。

要搞清楚:

  • DP数组及其下标的含义;
  • DP数组如何初始化;
  • 递推公式;
  • 遍历顺序;
  • 打印DP数组;

无论难易,动态规划都可以用这5步来深入理解,即动规五部曲。因为对于动规,如果没有方法论的话,可能简单题目可以顺手一写就过,难一点就不知道如何下手了。

● 509. 斐波那契数

简单题也养成五部曲的习惯。

DP数组及其下标的含义:dp[i]是第i个斐波那契数。

DP数组如何初始化(dp[0]=0;dp[1]=1)、递推公式(dp[i]=dp[i-1]+dp[i-2])、遍历顺序(一层for循环,是从小到大递推所以从小到大遍历)、打印DP数组(设置n为一个不太大的数打印序列来检查正确性)这些都是直接能知道的。

代码如下:注意是返回dp[n]不是dp[n-1],所以一开始数组大小得是n+1个。

class Solution {
public:int fib(int n) {if(n==0)return 0;vector<int> dp(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];}
};

● 70. 爬楼梯

n=1,2,3,4的方法数依次是1,2,3,5(全是1步1种,一个2步3种,2个2步1种),找规律发现还是一个斐波那契额数列。所以五部曲跟上一题相同。注意dp数组初始化的元素个数和返回的下标。

class Solution {
public:int climbStairs(int n) {if(n==1)return 1;vector<int> dp(n);dp[0]=1;dp[1]=2;//初始化,下标0是n=1for(int i=2;i<n;++i){dp[i]=dp[i-1]+dp[i-2];}return dp[n-1];}
};

● 746. 使用最小花费爬楼梯

DP数组及其下标的含义:dp[i]是从底部(注意从0/从1开始都可以)到第i层的最低花费。要返回的还是dp数组最后一个数dp[n]。

DP数组如何初始化:dp[0]=0,dp[1]=0(也是0,因为可以从1开始);

递推公式:递推公式是要从之前的dp序列得到dp[i],所以我们要立足下标i,根据题目意思,要想到达i,有两种选择:上一节台阶跨一步,上上一节台阶跨两步。取决于两种情况哪一种花费更低,所以用min:dp[i]=min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2])。

遍历顺序:仍然是从小到大;

打印DP数组:

发现数组下标含义、初始化、递推都是要仔细思考的,要做到一致统一。

class Solution {
public:int minCostClimbingStairs(vector<int>& cost) {if(cost.size()==1)return cost[0];int n=cost.size();vector<int> dp(n+1);dp[0]=0;//初始化dp[1]=0;for(int i=2;i<=n;++i){dp[i]=min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]);cout<<dp[i]<<"   ";//打印检查}return dp[n];//底部到n个台阶的时间}
};

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

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

相关文章

DiskGenius v4.30专业版下载

DiskGenius是一款专业级的数据恢复软件&#xff0c;算法精湛、功能强大&#xff0c;用户群体广泛&#xff1b;支持各种情况下的文件恢复和分区恢复&#xff0c;恢复效果好&#xff1b;文件预览、扇区编辑、加密分区恢复、Ext4分区恢复、RAID恢复等高级功能应有尽有&#xff0c;…

C++设计模式-简单工厂模式,工厂方法模式,抽象工厂模式

目录 简单工厂模式&#xff0c;工厂方法模式&#xff0c;抽象工厂模式 附&#xff1a; 简单工厂模式&#xff0c;工厂方法模式&#xff0c;抽象工厂模式 简单工厂模式&#xff1a;根据字符串参数返回对象。 工厂方法模式&#xff1a;创建一维对象&#xff0c;即一个工厂创建…

Vue3+TS+Vite+Pinia最全学习总结

VUE3介绍 vue2和vue3之间的区别 因为需要遍历data对象上所有属性&#xff0c;所以如果data对象属性结构嵌套很深&#xff0c;就会存在性能问题。因为需要遍历属性&#xff0c;所有需要提前知道对象上有哪些属性&#xff0c;才能将其转化为getter和setter,所以vue2中无法将data新…

嵌入式Linux:main函数的使用方法

和单片机开发一样&#xff0c;在Linux中&#xff0c;C语言程序的执行通常从main函数开始。main函数是程序的入口点&#xff0c;当程序启动时&#xff0c;操作系统会调用main函数来执行程序的主要逻辑。 不同于单片机开发&#xff0c;通常设置main函数没有参数&#xff0c;Linu…

一起畅玩!幻兽帕鲁服务器1分钟开服,不服来战!

玩转幻兽帕鲁服务器&#xff0c;阿里云推出新手0基础一键部署幻兽帕鲁服务器教程&#xff0c;傻瓜式一键部署&#xff0c;3分钟即可成功创建一台Palworld专属服务器&#xff0c;成本仅需26元&#xff0c;阿里云服务器网aliyunfuwuqi.com分享2024年新版基于阿里云搭建幻兽帕鲁服…

Docker方式创建keepalived连接MGR集群

记录一下简单的搭建步骤以便后期查验 目录 前言步骤1. 安装环境2. 重新制作镜像3. 导入新镜像4. 创建容器 前言 假设已经搭建了MySQL8的MGR集群方式&#xff08;一主两从&#xff09;。 MGR本身有故障转移重新选举新的主节点功能&#xff0c;但是上游的应用程序需要自己手动修…

Facebook的社交影响力:用户行为解析与趋势

在当今数字时代&#xff0c;社交媒体已经成为人们日常生活中不可或缺的一部分&#xff0c;而Facebook作为全球最大的社交平台之一&#xff0c;其社交影响力愈发显著。本文将深入分析Facebook的社交影响力&#xff0c;解析用户行为&#xff0c;同时探讨当前和未来的社交趋势。 社…

vue项目线上页面刷新报404 解决方法

一.修改配置文件 nginx.conf &#xff0c;并重新加载或重启 我的nginx版本是1.9.9 location / {try_files $uri $uri/ /index.html; }原因&#xff1a; 打包后的dist下只有一个 index.html 文件及一些静态资源&#xff0c;这个是因为Vue是单页应用(SPA)&#xff0c;只有一个…

学习Spring的第十三天

非自定义bean注解开发 设置非自定义bean : 用bean去修饰一个方法 , 最后去返回 , spring就把返回的这个对象,放到Spring容器 一 :名字 : 如果bean配置了参数 , 名字就是参数名 , 如果没有 , 就是方法名字 二 : 如果方法产生对象时 , 需要注入数据 , 在方法参数设置即可 , …

《深入浅出Go语言》大纲

目录 为什么选择《深入浅出Go语言》&#xff1f; 基础核心模块 为什么选择《深入浅出Go语言》&#xff1f; &#x1f680; 全面的基础知识体系 从环境搭建开始&#xff0c;对Go语言核心知识点进行深入探讨&#xff0c;深度挖掘每个基础知识的本质&#xff0c;为后续深入学习…

SOME/IP SD 协议介绍(四)服务发现通信行为

服务发现通信行为 启动行为 服务发现将根据服务实例处于以下三个阶段之一&#xff1a; • 初始等待阶段 • 重复阶段 • 主要阶段 一旦系统启动并且用于服务实例的接口连接已建立&#xff0c;服务发现将进入该服务实例的初始等待阶段。 在进入初始等待阶段并在发送第一条服…

VScode+PlatformIO 物联网Iot开发平台环境搭建

1.vscode &#xff08;1&#xff09;安装platformIO插件 &#xff08;2&#xff09;新建项目或导入已有的arduino项目 Name&#xff1a;需要填写你项目的名称&#xff1b; Board&#xff1a;点开是一个下拉框&#xff0c;但是可以输入你想要的开发板&#xff0c;这里选择&quo…

你所不知道的关于库函数和系统调用的那些事

系统调用和库函数的区别 相信大家在面试或者刷面试题的时候经常能看到这样的问题&#xff0c;“简述一下系统调用和库函数的区别”。 系统调用是操作系统提供给用户的接口&#xff0c;能让用户空间的程序有入口访问内核。而库函数数一组标准函数&#xff0c;比如复合 POSIX 或…

Git 入门指南:从新手到高手的完全指南

Git是一种强大的分布式版本控制系统&#xff0c;广泛应用于软件开发中。它的使用不仅可以帮助开发团队更好地管理代码&#xff0c;还可以提高团队协作效率和代码质量。随着软件开发的不断发展&#xff0c;版本控制成为了程序员必备的一项技能。 Git作为最流行的分布式版本控制系…

90.网游逆向分析与插件开发-游戏窗口化助手-项目需求与需求拆解

内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;实现物品使用策略的功能-CSDN博客 项目需求&#xff1a; 在游戏窗口化时&#xff0c;可以在游戏之外弹出一个窗口&#xff0c;可以隐藏或者显示游戏窗口&#xff0c;显示游戏人物的基本状态&#xff…

LeetCode--代码详解 2.两数相加

2.两数相加 题目 难度&#xff1a;中等 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数…

gerrit(1) | gerrit 简介

gerrit(1) | gerrit 简介 1. 目的 之前用过 gitlab CI/CD, github actions, 以及公司的配置管理员配置的 jenkins。 github 的 MR&#xff0c; github 的 PR&#xff0c; 虽然在用&#xff0c; 但仅限于参与开源项目或公司内的开源项目&#xff0c; OEM 项目中完全没在用。 …

【JavaScript + CSS】随机生成十六进制颜色

效果图 实现 <template><div class"year_area"><div class"year_list"><el-row :span"24"><div :class"showAll"><el-col :span"5" v-for"(item, index) in defaulList" :key&…

Shell脚本是一种用来自动化执行一系列命令的文本文件

Shell脚本是一种用来自动化执行一系列命令的文本文件。它可以包含一系列的Shell命令和控制结构,用于实现特定的功能或任务。 以下是一些使用Shell脚本的常见情况: 自动化任务:可以使用Shell脚本编写自动化任务,例如备份文件、定时执行命令等。 系统管理:通过Shell脚本可以…

电动汽车充放电V2G模型(matlab代码)

目录 1 主要内容 1.1 模型背景 1.2 目标函数 1.3 约束条件 2 部分代码 3 效果图 4 下载链接 1 主要内容 本程序主要建立电动汽车充放电V2G模型&#xff0c;采用粒子群算法&#xff0c;在保证电动汽车用户出行需求的前提下&#xff0c;为了使工作区域电动汽车尽可能多的消…