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

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. 使用最小花费爬楼梯

五部曲:

  1. DP数组及其下标的含义:dp[i]是从底部(注意从0/从1开始都可以)到第i层的最低花费。要返回的还是dp数组最后一个数dp[n]。
  2. DP数组如何初始化:dp[0]=0,dp[1]=0(也是0,因为可以从1开始);
  3. 递推公式:递推公式是要从之前的dp序列得到dp[i],所以我们要立足下标i,根据题目意思,要想到达i,有两种选择:上一节台阶跨一步,上上一节台阶跨两步。取决于两种情况哪一种花费更低,所以用min:dp[i]=min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2])。
  4. 遍历顺序:仍然是从小到大;
  5. 打印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.lryc.cn/news/297336.html

相关文章:

  • Android Studio 安装Flutter插件但是没法创建项目
  • 新春快乐(烟花、春联)【附源码】
  • nextcloud 优化扩展
  • 【CSS】css如何实现字体大小小于12px?
  • 【Langchain+Streamlit】旅游聊天机器人
  • 〖大前端 - ES6篇②〗- let和const
  • JAVA设计模式之代理模式详解
  • vivo发布2023 年度科技创新;阿里全新AI代理,可模拟人类操作手机
  • 【制作100个unity游戏之23】实现类似七日杀、森林一样的生存游戏15(附项目源码)
  • python巧用定理判断素数
  • 2023年总结
  • Git中为常用指令配置别名
  • STM32内部Flash
  • html5 audio video
  • LoveWall v2.0Pro社区型校园表白墙源码
  • Flink cdc3.0动态变更表结构——源码解析
  • WWW 2024 | 时间序列(Time Series)和时空数据(Spatial-Temporal)论文总结
  • 代码随想录算法——数组
  • Linux第45步_通过搭建“DNS服务器”学习图形化配置工具
  • 【Linux取经路】探寻shell的实现原理
  • 【MATLAB】使用随机森林在回归预测任务中进行特征选择(深度学习的数据集处理)
  • 2024Node.js零基础教程(小白友好型),nodejs新手到高手,(六)NodeJS入门——http模块
  • 【数据结构与算法】(5)基础数据结构之队列 链表实现、环形数组实现详细代码示例讲解
  • (注解配置AOP)学习Spring的第十七天
  • [C++] opencv + qt 创建带滚动条的图像显示窗口代替imshow
  • C#用Array类的Reverse方法反转数组中元素
  • iOS AlDente 1.0自动防过充, 拯救电池健康度
  • 春晚刘谦魔术——约瑟夫环
  • itextpdf使用:使用PdfReader添加图片水印
  • 如何为Kafka加上账号密码(二)