递归及DP

DAY44:动态规划(四)整数拆分(递归+DP递推都可以做,注意区别和理解) 递归做法更加直观也更好理解,核心就是枚举从1–n的所有i和n-i的乘积结果,找到最大值。(实际上枚举1–n/2即可,i和n-i后半段是重复的)但是这种做法,dfs(n-i)的拆分里会有大量的重复拆分,例如dfs(5)这个数值,遍历到dfs(9),dfs(8),dfs(7)的时候都会再拆一遍,造成大量时间消耗,会超时。因此需要靠记忆化搜索进行防止重复拆分的操作,用memo数组存下每一次拆分的最终结果dfs(n)。递归之前检查如果memo数组有这个dfs(n),直接返回memo存的结果。 阅读详情

递归

程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。

递归算法解决问题的特点:
(1)递归就是在过程或函数里调用自身
(2)在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。
(3)递归算法解题通常显得很简洁,但递归算法解题的运行效率较低,所以一般不提倡用递归算法设计程序。
(4)在递归调用的过程中系统为每一层的返回点、局部量等开辟了栈来存储,递归次数过多容易造成栈溢出等。

斐波拉契数列

def fib(x):
    if x < 2:
        return 0 if x == 0 else 1
    # 当x > 2时,开始递归调用fib()函数:
    return fib(x - 1) + fib(x - 2)

print(fib(6))  # 打印结果为:8

动态规划

通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。动态规划常常适用于有重叠子问题和最优子结构性质的问题。

走楼梯问题
有十个台阶,从上往下走,一次只能走一个或两个台阶,请问总共有多少种走法?
1、最优子结构:我们来考虑要走到第十个台阶的最后一步,最后一步必须走到第八或者第九。不难得到 f(10) = f(9)+f(8)。f(9) = f(8)+f(7)
2、边界:f(1) = 1, f(2) = 2
3、状态转移:f(n) = f(n-1) + f(n-2)

解法一:递归
def get_count(n):
    if n == 1:return 1
    if n == 2:return 2
    else:
        return get_count(n-1)+get_count(n-2)
print(get_count(10))

在这里插入图片描述
很显然这是一个满二叉树,高度为N-1。所以总节点数为2N-1,时间复杂度为O(2N)
回顾一下上面的递归计算方法,我们不难看出,本来总共只有f(1)-f(N)个节点,硬生生被增加到2^N-1个,这就是产生了大量重复的运算。找到问题的根源,对应的解决方法就应运而生,那就是从下往上算,把以前计算过的数值,保存在一个哈希表中,然后后面计算时先查询一下,存在就无需计算。时间复杂度为O(n) ,空间复杂度为O(n)。但是在仔细一想其实,无需保存所有的f,每个f都只与前两个值相关,所以空间复杂度可以降低为O(1).我们来看看相关代码。

def get_count(n):
    if n == 1:return 1
    elif n == 2 :return 2
    else:
        l = [1,2]
        for i in range(3,n):
            l[0],l[1] = l[1],l[0]+l[1]
        return l[0]+l[1]

LeetCode

343 整数拆分
给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。
示例 1:
输入: 2
输出: 1
解释: 2 = 1 + 1, 1 × 1 = 1。
示例 2:
输入: 10
输出: 36
解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。
说明: 你可以假设 n 不小于 2 且不大于 58。

思路:
自顶向下的思考:第n个数对应拆分结果为,in-i的拆分结果 和 in-i的最大值。
得到了对应的状态转移方程:F(n) = MaX(i*(n-i) , iF(n-i))其中I = (1到 n-1)
反推自底向上。F(1) = 1 F(2) = 1 …F(n) = MaX(i
(n-i)

class Solution {
    public int maxProfit(int[] prices) {
        int n = prices.length;
        if(n<=1)
            return 0;
        
        int[] min = new int[n];
        min[0] = prices[0];
        int res = 0;
        for(int i= 1 ; i<n ; i++){
            if(prices[i] > min[i-1])
                res = (int)Math.max(prices[i]-min[i-1],res);
            min[i] = (int)Math.min(min[i-1] , prices[i]);
        }
        
        return res;
    }
}

53.最大子序和
给定一个序列(至少含有 1 个数),从该序列中寻找一个连续的子序列,使得子序列的和最大。
例如,给定序列 [-2,1,-3,4,-1,2,1,-5,4],
连续子序列 [4,-1,2,1] 的和最大,为 6。

class Solution:
    def maxSubArray(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        sum = 0
        MaxSum = nums[0]
        for i in range(len(nums)):
            sum += nums[i]
            if sum > MaxSum:
                MaxSum = sum
            if sum < 0:
                sum = 0
        return MaxSum

参考文献

https://blog.youkuaiyun.com/qq_34364995/article/details/80284270
https://www.cnblogs.com/patatoforsyj/p/9463945.html
https://www.cnblogs.com/linshuhui/p/9680146.html
https://blog.youkuaiyun.com/allenchenhh133/article/details/80291252
https://blog.youkuaiyun.com/rock_joker/article/details/68928150

Winform零基础从入门到精通(3)——WinForm基础语法与事件机制详解 通过系统学习基础语法与事件机制,结合实际问题调试,可以快速掌握WinForm开发的核心技能。遇到问题时,优先检查事件绑定和异常处理,逐步培养代码规范意识。​安全转换字符串为数值,避免输入错误导致的崩溃。验证输入(如仅允许数字)​)传递事件相关数据。◦ 事件参数类型:​。 阅读详情

相关推荐

Python遥感技术实战:NDWI与MNDWI水体提取算法对比与优化

本文详细对比了NDWI与MNDWI两种水体提取算法在Python遥感技术中的应用。通过实战代码演示,分析了二者在自然与城镇场景下的表现差异,并重点介绍了阈值优化与后处理技巧,旨在帮助读者掌握高效、精准的水体提取方法,提升遥感数据分析能力。

f6g7h8i9j的博客 499

DP的基本递归方程

离散系统动态规划递推方程

qq_43526137的博客 221

Win11实时字幕还能这么玩?手把手教你打造专属‘AI字幕机’,告别视频网站无字幕困扰

本文详细介绍了如何利用Win11的实时字幕功能打造全平台通用的AI字幕系统。通过C#抓取程序、Node.js中转服务和前端展示界面的组合,实现自动抓取系统字幕并实时推送到任意网页视频的方案,有效解决在线视频无字幕的困扰。

weixin_33735077的博客 395

从递归入门dp(一)(非严格原创)

对dp算法总结(供个人复习)

icebeeeeeef的博客 671

从Transformer到蛋白质结构预测:手把手解读ESM系列模型的核心原理与实战价值

本文深入解析了ESM系列模型如何将Transformer架构创新应用于蛋白质结构预测,揭示了其从氨基酸序列到三维结构的高效预测机制。通过掩码语言模型预训练和注意力机制,ESM模型不仅捕捉蛋白质序列的远程相互作用,还在蛋白质工程改造、药物发现等领域展现出巨大实战价值,显著提升了结构预测速度和精度。

weixin_28744423的博客 320

Warning-[INFL_DELTA] Too many events zero delay loop

项目场景: 运用VCS工具执行仿真的时候,遇到如下错误提示,但仿真还在继续。 Warning-[INFL_DELTA] Too many events Possible zero delay loop. Too many events in the simulation at time 0 fs. 问题描述: 为什么会有这个问题; 什么导致了这个问题; 原因分析: 1、为什么会有这个问题 由于竞争条件或编码风格不明确,可能会产生零延时回路,导致仿真挂起或仿真时间无限。 2、什么导致了这个问题 举

hh199203的博客 1万+

DP和递归的区别

可以用动态规划的问题都能用递归: 从子问题入手,解决原问题,分两种做法:自顶向下和自底向上 前者对应递归,借助函数调用自己实现,是程序解决问题的方式,它不会记忆解. 后者对应DP,利用迭代将结果存在数组里,从数组0位开始顺序往后计算. 递归的缺点在于包含重复的子问题,DP 的效率更高. DP也有局限性: DP 相比于 递归,有时候不太好理解,或者边界情况比较难确定而且必须是一步步邻接的,连续地计算. 结合了记忆化的递归,灵活很多,它在递归基础上稍作修改即可,有时候更好理解,也少了局限性,不好用DP时一定能用

yzxmf111的博客 1548

ANFIS实现数据非线性回归附Matlab代码

在本文中,我们将介绍如何使用Matlab实现基于MSE的ANFIS非线性回归,并提供相应的源代码。ANFIS是一种融合了模糊逻辑和神经网络的方法,它可以通过学习数据集中的模式来构建一个模糊推理系统。ANFIS的训练过程基于最小化MSE,以提高模型的拟合能力。通过上述代码示例,我们可以使用基于MSE的ANFIS模型对数据进行非线性回归,并获得相应的预测结果。在示例中,我们定义了一个包含两个样本的新输入数据集 X_new,然后使用训练好的ANFIS模型进行预测,并将结果存储在变量 Y_pred 中。

2301_79326588的博客 476

从递归入手dp(二)

一些基础二维dp

icebeeeeeef的博客 859

【实战项目开发技术分享】如何设置机器人禁行区/虚拟墙

在现代机器人技术的日益发展中,路径规划是使机器人在复杂环境中安全、高效移动的关键部分。其中一个重要的问题是如何划定机器人的禁行区,以确保机器人不会进入危险区域或无法到达的地方。在本文中,我们将探讨一些关键策略,帮助机器人算法工程师更好地划定禁行区。代价地图可以通过多层叠加来实现,一般包括以下几个层级:静态地图层(Static Map Layer):由SLAM(Simultaneous Localization and Mapping)构建的静态地图。该层包含了环境中固定不变的地物信息,如墙壁、家具等。

xiewf的博客 1万+

Swin Transformer 与 CNN 结合实现图像分类

Swin Transformer 与 CNN 结合实现图像分类。(含swin transformer 结构讲解,cnn网络搭建,代码)

这里是Mae。 5027

Dp后的递归输出

DpDpDp后的递归输出 正在填补中…..

你看天幕他一瞬陷下。 2066

Codex 实战 Skills:编写 Skill 自动为 ESP32 芯片生成 MQTT 订阅与发布的基础代码

为了更清晰地展示 Skill 的工作原理和两种语言的差异,以下提供原理图和比对表格。本文深入探讨了如何利用 Codex 的 Agent 智能体技能(Skills)自动化 ESP32 与 MQTT 通信的代码生成过程。我们首先分析了 IoT 开发的痛点,然后详细设计了 Skill 的输入配置,并分别提供了 MicroPython 和 C++ 两种语言的完整代码实现。通过对比两种语言的优缺点,帮助开发者根据项目需求选择合适的语言。最后,我们提供了详细的运行指南,确保开发者能够快速上手。Skill 设计哲学。

yueyeguzhuo的专栏 83

从递归到DP——再看斐波拉契数列问题

目录 用递归解决: 换用DP: 注意: DP题目的特征: 最优子序列 重叠子序列 很久之前学习的递归,解决的第一个问题就是斐波拉契数列问题: https://blog.youkuaiyun.com/qq_41895747/article/details/100173991 从递归到DP解决01背包问题: https://mp.youkuaiyun.com/postedit/103898847 用递归...

沉迷单车的追风少年 474

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

pta -oj 关于递归,搜索和dp的关系

递归,搜索和dp的关系(短时间记录,缺乏一定逻辑!,有空再详细整理心得) 1.普通的递归,要有递归式和截止点,即递归停止的地方。 2.递归的方式,分为简单递归和复杂递归,简单递归即求阶乘,网上资源很多,复杂递归就想搜索靠拢了,如下的口袋问题,实际上已经可以把for看做一层搜索了! 3.先说一下搜索的条件,必须由分岔口和死胡同(定义见算法笔记),而这里的for里面的generate即可以理解为多个岔...

weixin_38023259的博客 422

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

分割等和子集 (递归 二维dp 一维dp)

问题描述: 给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/partition-equal-subset-sum 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 大体思路: 由于想将数组分割为两个和相同的子集,因此可以先获得数组整体的和,然后该问题可以转化为找数组中是否存在某几个元素之和等于总和的一半。注:若总和为奇数则可以直接返

gw_9527的博客 417

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

python编程——005递归及DP

一、递归和DP 1)递归 一般情况下,递归定义包含两部分,其中至少有一种基本情况可以直接得到在特定情况下的结果,还有一种递归或者归纳情形定义出在其他情况下的结果。 举一个简单的阶乘例子: 1!=1 (n+1)!=(n+1)*n! 第一个式子定义了基本情况,第二个式子定义了其余情况 那么我们下面用两段代码来比较一下迭代和递归 #迭代 def fact1(n): result=1 wh...

小熊哥哥的博客 1038

从递归到DP(动态规划)

从递归到DP 那么,首先让我们看一看什么是DP(动态规划) 百度百科曰: 动态规划(Dynamic Programming,DP)是运筹学的一个分支,是求解决策过程最优化的过程。20世纪50年代初,美国数学家贝尔曼1(R.Bellman)等人在研究多阶段决策过程的优化问题时,提出了著名的最优化原理,从而创立了动态规划。动态规划的应用极其广泛,包括工程技术、经济、工业生产、军事以及自动化控制等领域,并在背包问题、生产经营问题、资金管理问题、资源分配问题、最短路径问题和复杂系统可靠性问题等中取得了显著的效果

UnmatchedPeach的博客 939

递归及DP:学习递归思想,动态规划思想

任务:递归及DP:学习递归思想,动态规划思想,并同时温习前四天内容,做出总结。 递归: 在调用一个函数的过程中,直接或间接地调用了函数本身这个就叫递归。简而言之就是自己调用自己。大概步骤如下: 1、写出临界条件 2、找出这一次和上一次关系 3、假设当前函数已经能用,调用自身计算上一次的结果,再求出本次的结果 递归两个基本要素: (1) 边界条件:确定递归到何时终止,也称为递归出口。 (2) 递归模...

K.H&T 632

滑雪【线性DP】【递归】

&gt;Description Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael想知道载一个区域中最长底滑坡。区域由一个二维数组给出。数组的每个数字代表点的高度。下面是一个例子 1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 ...

//(^ o ^)// 400

星际能量矩阵:树形 DP 的递归与非递归双解

维度DFS 递归版BFS 非递归版思维模型“先钻到底,再回来汇报”“先排好队,再倒着统计”代码量短小精悍稍长(需维护队列和数组)内存消耗占用系统栈占用堆内存稳定性深度过大时会崩溃极其稳定。

布心老混子 所有代码均老混子本人远古手搓 易错点均为学生真实场景 博客文章部分借助ai生成 664

leetcode91(递归和DP解法)

超时递归 class Solution { private: int cnt = 0; public: int numDecodings(string s) { dfs(0,s); return cnt; } bool isOk(string t) { if(t.size() == 1) ...

剑似生平 253

LCS 递归与DP迭代

文章目录1.题目2.数据结构与算法3.源代码4.时间复杂度5.结论 1.题目 给定两个字符串,两个字符串的公共子串中最长的即为"最长公共子串" LCS 2.数据结构与算法 给定两个字符A[0, n), B[0, m) 递归实现:比较两个字符串的末尾字符,总共有3种情况 1.递归基:m=0或 n=0, 其中一个字符为空字符,直接返回空串即可。 2. 末字符 A[n-1] == B[m-1] == "X" 减而治之: lcs(A[0, n-1), B[0,m-1)) + “X” 其中 子问题:两子串的lc

Devil_DiabLo的博客 553

Fibonacci数列 递归与DP迭代

文章目录1.题目2.数据结构与算法3.源代码4.时间复杂度5.结论 1.题目 求解Fibonacci数列的第n项。 0 1 1 2 3 5 8 13 ... 2.数据结构与算法 1.分治递归 2.记忆(memoization) 3.动态规划(dynamic programming):由自顶而下的递归,转为自底而上的迭代。 3.源代码 #include "stdafx.h" #include <iostream> using namespace std; //递归 int fib(int n)

Devil_DiabLo的博客 279

树形 DP 入门:递归返回值要先想清楚

树形 DP 入门要先定义递归返回值、子状态合并方式、全局答案更新位置和空节点边界。递归返回值想清楚,代码自然会短。没想清楚,树再简单也会绕晕。

cannonjinx的博客 1722

递归与DP

每一个递归问题都可以改成DP来做。。。只不过DP会浪费一些空间罢了。。DP只是把之前的结果存起来以防再算一遍罢了。。。。。 转载于:https://www.cnblogs.com/miaoz/p/4186105.html...

weixin_30685029的博客 96
上一篇: Python基础4
下一篇: leetcode 8. 字符串转换整数 (atoi)
程序员椰子橙
博客等级 码龄9年 46粉丝 163原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值