【算法模板】动态规划(基础DP篇),Python笔试面试题

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Python全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img



既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Python知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024c (备注Python)
img

正文

💗同时也非常感谢各位小伙伴们的支持💗

🌈每日一语:你相信光吗? 🌈

将过去和羁绊全部丢弃,不好吝惜那为梦想留下的泪水 。 ——路飞

在这里插入图片描述

文章目录

  • 【算法模板】动态规划(基础DP篇)

    • 前言
  • 什么是动态规划?

  • 动态规划的做题方法

  • 一维DP

    • 简介
  • 走进一维DP

  • 模块练习题

  • 二维DP

    • 简介
  • 走进二维DP

  • 模块练习题

  • 总结

前言


博主因最近刷的大部分都是动态规划的算法题,所以也把博主所刷的心得和习题在本篇文章中总结分享给大家,并且希望能帮助到大家。

感谢: 感谢csdn、力扣、代码随想录等平台和大佬们提供的习题和题解!!


什么是动态规划?


动态规划 (英语:Dynamic programming,简称 DP),是一种在数学、管理科学、计算机科学、经济学和生物信息学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。 动态规划常常适用于有重叠子问题和最优子结构性质的问题。(百度百科得到的答案)

简单的就是说:用简单的方法来解决复杂的问题!

核心思想:

动态规划的核心就是 有记忆,减少不必要的计算!

熊猫人 max,胖版熊猫人 - 熊猫头斗图表情包 _熊猫人_斗图表情

动态规划的做题方法


一般我们在做动态规划这种题的时候一般会有一下这几个步骤:

  • 定义一个的dp数组。

  • dp数组的初始化。

  • 列举动态规划推导公式。

  • 进行循环遍历逐步改变dp数组的值,直道循环结束能获取我们所需要的值即可。

我们只要上述的几个步骤没有出现什么问题的话,那么这个这个题也就是手到擒拿了!

而上述步骤中比较难的就是 动态规划推导公式 的推导,一般在做题时我们很容易的知道这个题是用动态规划来解决这个问题。但是每次就会卡到动态规划推导公式这个地方(不要问我为什么5555)。所以这个也是我们需要提高的地方!!!

给大家一些 建议 ,在做动态规划题的时候 一定要自己推导自己的动态规划推导公式 ,就算写不出来我们在看题解的时候也可以那我们自己推导出来的公式和官方的公式进行一个对比,每次在做题的时候只要能保证这点,则以后的进步就会越来越大!!!


一维DP


简介

在上面我们已经知道了什么是 DP 了,那么什么又是 一维DP 呢?

一维DP:

通常的讲 一维DP 就是通过一维的数组来满足 推导公式 的一个求解。

int[] dp = new int[10];//则表示创建了一个长度为10的一维DP数组。

//例如:推导公式

dp[i] = max(dp[i - 2] + dp[i - 1] , dp[i])//这个就是一个比较简单的一维DP推导公式!

走进一维DP

上述中我们知道了什么是 一维DP ,那我们就要来走进这个它,并且征服它!同学们来看下面的例题吧。

熊猫何苦为难熊猫(熊猫头)_熊猫_何苦_为难表情

例题:

509. 斐波那契数

题目:

斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 01 开始,后面的每一项数字都是前面两项数字的和。也就是:

F(0) = 0,F(1) = 1

F(n) = F(n - 1) + F(n - 2),其中 n > 1

示例:

输入:n = 2

输出:1

解释:F(2) = F(1) + F(0) = 1 + 0 = 1

做题步骤:

还记得我们第一步需要怎么来分析的吗?

第一步我们需要确定这题的 DP 数组该怎么去创建?

第二步需要我们推导出本题的 DP 公式。

第三步进行循环得到我们需要的结果。

思路:

通过做题步骤我们能知道这个 DP数组 的长度是 n + 1 (因为需要从0开始到n,所以长度也就是 n + 1

题目所说从 1 后面开始每一项的数字都是前两项的和。通过解析这句话我们能知道我们的 循环是从2开始,到n结束 。而推导公式则就是:

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

当我们完成上述的步骤时接下来就是将这题给实现了。

代码:

Python版本:

class Solution:

def fib(self, n: int) -> int:

if n < 2:

return n

dp = [0]* (n + 1)

dp[1] = 1

for i in range(2 , n + 1):

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

return dp[n]

Java版本:

class Solution {

public int fib(int n) {

if (n == 0) return 0;

if (n == 1) return 1;

int[] dp = new int[n + 1];

dp[1] = 1;

for (int i = 2; i < n + 1; i++){

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

}

return dp[n];

}

}

我们做了一个比较简单的DP题,那我们再来看另外一个简单的DP问题吧

题目:

746. 使用最小花费爬楼梯

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

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

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

示例:

输入:cost = [10,15,20]

输出:15

解释:你将从下标为 1 的台阶开始。

  • 支付 15 ,向上爬两个台阶,到达楼梯顶部。

总花费为 15

做题步骤:

DP数组 的创建。

推导出本题的 DP 公式。

进行循环。

思路:

在题目的含义中我们已经知道了 用最小的花费来达到顶楼! 则我们需要创建的 DP数组 长度就为 n + 1 (第n 个下标代表的是楼顶)。则也能得到动态规划的公式和循环的开始点和结束点!

动态规划公式:

dp[i] = min(dp[i-1]+cost[i-1],cost[i-2]+dp[i-2])//从4开始的循环公式

dp[i] = min(dp[i - 1] + cost[i - 1], cost[i - 2] )//当i是等于3的时候判断方程式

dp[i] = min(cost[i - 1], cost[i - 2])//等于2的时候的一个公式

代码:

Python版本

class Solution:

def minCostClimbingStairs(self, cost: List[int]) -> int:

dp = [0 for i in range(len(cost)+1)]

for i in range(2,len(cost)+1):

if i ==3 :

dp[i] = min(dp[i - 1] + cost[i - 1], cost[i - 2] )

elif i ==2 :

dp[i] = min(cost[i - 1], cost[i - 2])

else:

dp[i] = min(dp[i-1]+cost[i-1],cost[i-2]+dp[i-2])

return dp[len(cost)]

Java版本:

class Solution {

public int minCostClimbingStairs(int[] cost) {

int[] dp = new int[cost.length + 1];

for(int i = 2; i < cost.length + 1; i ++){

if (i == 2){

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注python)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
,cost[i-2]+dp[i-2])

return dp[len(cost)]

Java版本:

class Solution {

public int minCostClimbingStairs(int[] cost) {

int[] dp = new int[cost.length + 1];

for(int i = 2; i < cost.length + 1; i ++){

if (i == 2){

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注python)
[外链图片转存中…(img-W2OPTlua-1713438123581)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 18
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值