算法沉淀 —— 动态规划篇(简单多状态dp问题下)

【DP】如何找到动态规划的状态转移方程 状态转移方程是动态规划的核心,其描述了从一个状态如何转移到另一个状态,即问题的当前解是如何通过子问题的解来构造的。状态转移方程的形式通常是:其中dp(i)表示问题在状态i时的解,f是一个根据问题特性定义的函数,用于将先前的状态(子问题的解)组合起来,得到当前问题的解。找到状态转移方程的核心是要理解如何将问题拆解成多个子问题,并根据子问题的最优解推导出整体问题的最优解。在确定状态和子问题后,我们需要建立这些状态之间的关系,即状态转移方程。 阅读详情

前言

几乎所有的动态规划问题大致可分为以下5个步骤,后续所有问题分析都将基于此

  • 1.、状态表示:通常状态表示分为基本分为以下两种,其中更是以第一种为甚。

    • 以i为结尾,dp[i] 表示什么,通常为代求问题(具体依题目而定)
    • 以i为开始,dp[i]表示什么,通常为代求问题(具体依题目而定)
  • 2、状态转移方程
    *以上述的dp[i]意义为以i位置为分界, 通过最近一步来分析和划分问题,由此来得到一个有关dp[i]的状态转移方程。

  • 3、dp表创建,初始化

    • 动态规划问题中,如果直接使用状态转移方程通常会伴随着越界访问等风险,所以一般需要初始化。而初始化最重要的两个注意事项便是:保证后续结果正确,不受初始值影响;下标的映射关系。
    • 而初始化一般分为以下两种:
      • 直接初始化开头的几个值。
      • 一维空间大小+1,下标从1开始;二维增加一行/一列。
  • 4、填dp表、填表顺序:根据状态转移方程来确定填表顺序。

  • 5、确定返回值

一、买卖股票的最佳时机含冷冻期

【题目链接】:309. 买卖股票的最佳时机含冷冻期
【题目】:

 给定一个整数数组prices,其中第 prices[i] 表示第 i 天的股票价格 。​
 设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):
 卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。
 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

【示例】:

输入: prices = [1,2,3,0,2]
输出: 3
解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]

【分析】:
 我们可以定义dp[i]表示第i天结束后,买卖股票的最大利润。但我们发现第i天股票分为3种状态:手中有股票、无股票、处于冷冻区。所以我们可以定义一个(n x 3)的二维数组,其中dp[i][0]表示第i天结束后,手中有股票的最大利润;dp[i][1]表示第i天结束后,手中无股票的最大利润;dp[i][2]表示第i天结束后,股票处于冷冻区的最大利润。

状态转移方程推导:
 第i天结束后,手中有股票的情况可由:i-1天结束手中有股票第i天什么都不做、i-1天无股票在第i天买入股票两种情况得到。所以可得状态状态转移方程为 dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] - prices[i]);
 第i天结束后,手中无股票的情况可由::第i-1天结束手中有股票在第i天卖掉股票、第i-1天股票处于冷冻区在第i天什么都不做两种情况得到。所以可得状态状态转移方程:dp[i][1] = max(dp[i - 1][1], dp[i - 1][2]);
 第i天结束后,股票处于冷冻区只能由第i-1天手中有股票第i天将股票卖出所得。所以可得状态状态转移方程:dp[i][2] = dp[i - 1][0] + prices[i];
在这里插入图片描述
 初始化:显然当i为0时,状态转移方程不适应,需要特殊处理。这里我们可以将第0天的买卖股票状态直接初始化好(具体参考代码)。然后从第2天开始,填dp表!!
 最后返回第n天结束后,返回手中无股票和股票处于冷冻区的最大值即可!!
【代码编写】:

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int n = prices.size();
        vector<vector<int>> dp(n, vector<int>(3));
        //初始化
        dp[0][0] = -prices[0];//第1天买人股票
        //填表
        for(int i = 1; i < n; i++)
        {
            dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] - prices[i]);
            dp[i][1] = max(dp[i - 1][1], dp[i - 1][2]);
            dp[i][2] = dp[i - 1][0] + prices[i];
        }
        return max(dp[n - 1][1], dp[n - 1][2]);
    }
};

二、买卖股票的最佳时机含手续费

【题目链接】:714. 买卖股票的最佳时机含手续费
【题目】:

 给定一个整数数组 prices,其中 prices[i]表示第 i 天的股票价格 ;整数 fee 代表了交易股票的手续费用。
 你可以无限次地完成交易,但是你每笔交易都需要付手续费。如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了。
 返回获得利润的最大值。
 注意:这里的一笔交易指买入持有并卖出股票的整个过程,每笔交易你只需要为支付一次手续费。

【示例】:

输入:prices = [1, 3, 2, 8, 4, 9], fee = 2
输出:8
解释:能够达到的最大利润:
在此处买入 prices[0] = 1
在此处卖出 prices[3] = 8
在此处买入 prices[4] = 4
在此处卖出 prices[5] = 9
总利润: ((8 - 1) - 2) + ((9 - 4) - 2) = 8

【分析】:
 我们可以定义dp[i]表示第i天结束后,所得最大利润。但第i天可以细分为手中有无股票。所以我们可以创建一个(n x 2)的数组,其中dp[i][0]表示第i天结束后,手中还有股票,此时所得的最大利润;dp[i][1]表示第i天结束后,手中无股票,此时所得的最大利润。

状态转移方程推导:
 dp[i][0]可以由:第i-1天后手中有股票并且第i天啥都不干、第i-1天后手中无股票并且第i天买入股票,所以状态转移方程为:dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] - prices[i]);。
 ;dp[i][1]可以由:第i-1天后手中无股票并且第i天啥都不干、第i-1天后手中有股票并且第i天卖出股票(此时一次交易完成,需要将费用fee减掉),所以状态转移方程为:dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i] - fee);
在这里插入图片描述

 初始化:显然当i为0时,状态转移方程错误。所以我们可以先初始化dp[0][0]、dp[0][1](即第1天结束后,股票和利润的情况,具体参考代码)。
 然后从左往右填dp表,最后返回第n天结束后手中无股票的最大值即可!!

【代码编写】:

class Solution {
public:
    int maxProfit(vector<int>& prices, int fee) {
        int n = prices.size();
        vector<vector<int>> dp(n, vector<int>(2));
        //初始化
        dp[0][0] = -prices[0];
        for(int i = 1; i < n; i++)
        {
            dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] - prices[i]);
            dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i] - fee);
        }
        return dp[n - 1][1];
    }
};

三、买卖股票的最佳时机 IV

【题目链接】:买卖股票的最佳时机 IV
【题目】:

 给你一个整数数组 prices 和一个整数 k ,其中 prices[i] 是某支给定的股票在第 i 天的价格。
&emsp设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。也就是说,你最多可以买 k 次,卖 k 次。
&emsp注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

【示例】:

输入:k = 2, prices = [2,4,1]
输出:2
解释:在第 1 天 (股票价格 = 2) 的时候买入,在第 2 天 (股票价格 = 4) 的时候卖出,这笔交易所能获得利润 = 4-2 = 2 。

【分析】:
 我们可以定义dp[i[表示第i天结束后,在最多可以完成 k 笔交易的情况下,买卖股票的获得的最大利润。但我们发现第i天的股票状态还可以细分:手中有无股票,已经交易几次(从0~k次)。所以我们可以创建两个(n x (k + 1))的二维数组f和g:其中f[i][j]表示第i天结束后,完成j次交易,并且手中有股票时所得利润最大值;g[i][j]表示第i天结束后,完成j次交易,并且手中无股票时所得利润最大值。

状态转移方程推导:(我们定义只有当股票卖出时,交易才算完成,次数+1)
 f[i][j]可由:(第i-1天结束后,完成j次交易,并且手中有股票(即f[i-1][j]),在第i天不交易)、(第i-1天结束后,完成j次交易,并且手中无股票(即g[i-1][j]),在第i天买入股票)两种方式得到。所以状态转移方程:f[i][j] = max(f[i - 1][j], g[i - 1][j] - prices[i]);

 g[i][j]可由:(第i-1天结束后,完成j次交易,并且手中无股票(即g[i-1][j]),在第i天不交易)、(第i-1天结束后,完成j-1次交易(第i-1天完成交易,此时交易次数加1得到j次),并且手中有股票(即g[i-1][j]),在第i天卖出股票)两种方式得到。所以状态转移方程:g[i][j] = max(g[i-1][j], f[i-1][j-1] + price[i]);
细节处理:

 显然当i为0时,f的状态转移方程不适用,需初始化第1行;但对于g来说,i=0和j=0时,状态转移方程都不适用,需要初始化第一行和第一列。又因为当j=0时,对于g来说此时手中无股票且完成0次交易,没有意义。所以我们对g的状态转移方程仅需转换:

if(j >= 1)
	g[i][j] = max(g[i-1][j], f[i-1][j-1] + price[i]);

 此时,我们只需要初始化f和g的第一行即可。由于本体种交易次数有限制,我们应当珍惜交易此时。所以我们在第一次时,不仅需交易。此时我们仅需初始化f[0][0]、g[0][0]即可。同时为了防止第一行,d[0][0]和f[0][0]后的数据对后续填表造成影响,我们需将d表和f表中相应的值初始化INT_MIN。
但此时使用状态转移方程可能发生越界,所以我们将INTMIN改为其一半0x3f3f3f3f。
【代码编写】:

class Solution {
public:
    const int KNF = 0x3f3f3f3f;//INT_MAX一半
    int maxProfit(int k, vector<int>& prices) {
        int n = prices.size();
        vector<vector<int>> f(n, vector<int>(k + 1, -KNF));
        auto g = f;
        //初始化
        f[0][0] = -prices[0], g[0][0] = 0;
        for(int i = 1; i < n; i++)
            for(int j = 0; j <= k; j++)
            {
                f[i][j] = max(f[i - 1][j], g[i - 1][j] - prices[i]);
                g[i][j] = g[i - 1][j];
                if(j >= 1)
                    g[i][j] = max(g[i][j], f[i - 1][j - 1] + prices[i]);
            }

        int ret = -KNF;
        for(int j = 0; j <= k; j++)
            ret = max(ret, g[n - 1][j]);
        return ret;
    }
};
2023-09-24-从线性连续时间状态转移方程推导离散状态转移方程 从线性连续时间状态转移方程推导离散状态转移方程 阅读详情

相关推荐

算法设计 - 01背包问题的状态转移方程优化,以及完全背包问题

算法设计 - 01背包问题的状态转移方程优化,以及完全背包问题

优快云 5546

动态规划-如何推导出状态转移方程?

今天学习了《程序员的数据基础课》中的动态规划小节。如果你觉得这个课程对你有启发,请通过 分享一个IT专属的数学课,让这个冬天不太冷 下方的链接购买,加我微信 somenzz,返你 12 元红包,降低你的学习成本。 什么是动态规划? 在递归的时候,我们可以通过不断地分解问题,将复杂的任务简化为最基本的小问题,比如基于递归实现的归并排序,排列,组合等。不过有时候,我们并不用处理所有可能的情况,只要找到...

somenzz的博客 1万+

电流采样(分流器与霍尔传感器)

霍尔效应霍尔效应是磁电效应的一种,这一现象是霍尔(A.H.Hall,1855—1938)于1879年在研究金属的导电机构时发现的。霍尔效应是研究半导体材料性能的基本方法。通过霍尔效应实验测定的霍尔系数,能够判断半导体材料的导电类型、载流子浓度及载流子迁移率等重要参数。简单原理如图1所示,半导体薄片两端通以控制电流I,垂直方向施加磁感应强度为B的匀强磁场,d为半导体材料的厚度,k为霍尔常数,它与半导体材质有关,则在垂直于电流和磁场的方向上,将产生电势差为UH的霍尔电压,它们之间的关系为。霍尔元件。

weixin_48867130的博客 1万+

【算法优选】 动态规划之简单多状态dp问题——壹

动态规划相关题目都可以参考以下五个步骤进行解答:状态表⽰状态转移⽅程初始化填表顺序返回值后面题的解答思路也将按照这五个步骤进行讲解。

m0_71731682的博客 1489

深入解读ATPG Pattern类型:除了Basic Scan,Clock PO和RAM Sequential模式怎么用?

本文深入解析ATPG高级Pattern类型,包括Clock PO和RAM Sequential模式的应用策略。通过Mentor DFT工具链中的Tessent平台,详细介绍了这些模式的工作原理、配置命令及实战案例,帮助提升芯片测试的故障覆盖率和效率。特别适用于处理时钟域交叉和嵌入式存储器的复杂电路测试需求。

weixin_27697385的博客 486

Xilinx GTY Transceiver时钟方案与功耗优化实践

本文详细解析了Xilinx GTY Transceiver的时钟方案设计与功耗优化实践,涵盖从基础配置到高速24.33024Gbps和中速10.1376Gbps的实战案例。通过Transceivers Wizard的IP设计技巧和动态功耗优化方法,帮助工程师有效降低FPGA系统功耗,提升高速串行通信的稳定性与效率。

weixin_28736355的博客 228

动态规划(一)一一状态定义和状态转移方程

动态规划真让人看得头疼,这只是一种思想,并没有一定的解题规律,当问题出现的时候,对于不太熟悉动态规划的人来说,确实有点难以想到,一般都是采用暴力求法。这里贴一个知乎链接,我觉得动态规划讲的还挺好的,什么是动态规划? 嘿嘿,也不知道会不会有人还会跳回来看看,哈哈。反正是写给自己的,问题不大。既然理解了上面是动态规划,就来几个简单的题目来练练手(题目来源leetcode)。 1 最大子序和 ...

qq_40963043的博客 3万+

告别混乱!AutoSar BswM模式管理实战:手把手教你配置Rule与ActionList(附避坑指南)

本文详细解析了AutoSar BswM模式管理的实战配置,重点介绍了Rule与ActionList的高效组合方法,帮助开发者避免常见陷阱。通过具体案例演示了从基础到复杂的配置步骤,包括模式仲裁、逻辑表达式构建及ActionList优化策略,提升汽车电子系统的协调性与可靠性。

weixin_27066963的博客 259

算法沉淀 —— 动态规划篇(简单多状态dp问题上)

力扣:面试题 17.16. 按摩师、LCR 090. 打家劫舍 II、740. 删除并获得点数、LCR 091. 粉刷房子

Zhenyu_Coder的博客 1169

大模型呼叫中心场景分享之六:大模型外呼IT运维告警——智能监控与自动化响应的未来

在数字化运维(IT Operations)中,实时监控系统健康状态并及时响应告警是保障业务连续性的关键。传统的IT告警方式(如邮件、短信、钉钉/企业微信通知)存在信息过载、响应延迟、人工处理效率低等问题。而大模型(LLM)与语音技术(TTS/ASR)的结合,为IT运维告警提供了更智能的解决方案——大模型外呼告警系统。大模型外呼告警系统正在重新定义IT运维的效率和体验。通过实时语音交互+智能自动化,企业能够将平均故障修复时间(MTTR)从小时级缩短至分钟级。

开源呼叫中心系统FreeIPCC的博客 922

GCJ02坐标系转WGS84坐标系(已实地测试基本无偏差)

坐标系转化,GCJ02坐标系,WGS84坐标系

Xiao_XianYu_的博客 1855

算法沉淀——动态规划之简单多状态 dp 问题(上)(leetcode真题剖析)

具体来说,可以创建一个大小为 10001(根据题目的数据范围)的 hash 数组,将 nums 数组中的每个元素 x 累加到 hash 数组下标为 x 的位置上。通过将每个数字的出现的和记录在 hash 数组中,然后在 hash 数组上应用「打家劫舍」的思路,你能够有效地解决这个问题。当然,因为市场上不同颜色油漆的价格不同,所以房子粉刷成不同颜色的花费成本也是不同的。个,每个房子可以被粉刷成红色、蓝色或者绿色这三种颜色中的一种,你需要粉刷所有的房子并且使其相邻的两个房子颜色不能相同。这个地方所有的房屋都。

立志做一个高产且细节博主 1782

【物联网】探索NE555:一款经典的集成电路(超详细)

NE555是一种集成电路,其内部结构包括比较器、RS触发器、电压比较器和输出级三个主要功能模块,外部引脚则提供了与其他电路元件进行连接的接口。NE555的设计目的是为了提供一种简单方便的定时器解决方案,它广泛应用于模拟和数字电路中。NE555作为一款经典的集成电路,具备设计简单、易于使用和稳定可靠的特点,在电子领域发展了广泛的应用。从单稳态模式到多稳态模式,再到振荡器模式,NE555可以满足不同的需求,并且可以与其他电路元件灵活组合,扩展其功能。然而,需要注意的是NE555也有一些限制。

Goforyouqp的博客 6万+

算法沉淀——动态规划之简单多状态 dp 问题(下)(leetcode真题剖析)

这里和上一题最大的区别就是交易次数的限制,需要注意的是,k值可能超过数组长度的一半,所以我们需要注意k的取值,其余同上一题的原理。你可以无限次地完成交易,但是你每笔交易都需要付手续费。**注意:**这里的一笔交易指买入持有并卖出股票的整个过程,每笔交易你只需要为支付一次手续费。**注意:**你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。**注意:**你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。**注意:**你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

立志做一个高产且细节博主 1712

医疗影像分析实战:肺炎X光片分类与分割

医疗影像分析实战:肺炎X光片分类与分割 ,人工智能,计算机视觉,大模型,AI,在医疗领域,医疗影像分析技术凭借其高效、精准的特点,成为疾病诊断与治疗的重要辅助手段。肺炎作为一种常见的呼吸道疾病,严重威胁人类健康,通过 X 光片对肺炎进行诊断是临床常用方法。利用计算机技术实现肺炎 X 光片的自动分类与分割,不仅能减轻医生的工作负担,还能提高诊断的准确性和效率。本文将深入讲解肺炎 X 光片分类与分割的实战过程,结合大量代码示例和关键概念解析,帮助读者掌握相关技术。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 3万+

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

阿里技术面试备战指南:系统设计与算法强化策略

分布式系统设计与算法优化是当代软件工程师的核心能力。从技术原理来看,分布式ID生成器需要平衡唯一性、有序性和性能,而动态规划算法则通过状态转移方程实现复杂问题的高效求解。这些技术在电商、金融等高并发场景中具有重要价值,例如订单系统的热点账户处理需要结合分库分表和本地消息表等方案。在阿里等头部企业的技术面试中,候选人常需应对系统设计题和算法变种题的挑战,2026年校招数据显示动态规划变种题占比高达42%。掌握空间优化型DP、多状态机DP等进阶解法,并采用'需求-瓶颈-方案'三段式框架应对系统设计问题,能显著提

weixin_30629653的博客 382

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

知识储备--基础算法篇-动态规划

有一堆石头,用整数数组stones表示。其中stones[i]表示第i块石头的重量。每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为x和y,且x

Orange_sparkle的博客 1172

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

从最长递增子序列学会如何推状态转移方程

点击上方蓝字设为星标东哥带你手把手撕力扣~作者:labuladong 公众号:labuladong若已授权白名单也必须保留以上来源信息也许有读者看了前文 动态规划套路详解,学会了动态规...

fdl123456的博客 1617

动态规划总结以及状态转移方程的推导(一)

动态规划(Dynamic Programming,DP)是运筹学的一个分支,是求解决策过程最优化的过程。 动态规划算法题如今很常见,通常用在求最优解问题上。DP作为求最优化的算法为什么会快?我们可以这样思考 ,无论是DP还是暴力,我们的算法都是在可能解空间内,寻找最优解。DP是枚举有希望成为答案的解。从而我们可以得到DP的核心思想:尽量缩小可能解空间。在暴力算法中,可能解空间往往是指数级的大小;如果我们采用DP,那么有可能把解空间的大小降到多项式级。一般来说,解空间越小,寻找解就越快。这样就完成了优化。.

LIHANGE 4755

洛谷P1284 三角形牧场——01背包+三角形知识(分析状态转移方程的推导方式)

sum:所有边长的和;dp[a][b]:能否组成长度分别为a,b,sum-a-b的三条边;在循环枚举a,b时注意枚举的顺序。

weixin_50836068的博客 509

C++动态规划问题—状态转移方程

​ 状态转移方程是动态规划(Dynamic Programming, DP)中的一个核心概念,它描述了从一个状态转移到另一个状态时的变化规则。在解决优化问题时,特别是当问题可以分解为重叠的子问题时,动态规划通过存储子问题的解来避免重复计算,从而提高效率。状态转移方程就是用来描述这种“状态”如何根据“决策”转移到下一个“状态”的数学表达式。​ 在经典的爬楼梯问题中,状态转移方程是。

weixin_45706195的博客 1560

10 | 动态规划(下):如何求得状态转移方程并进行编程实现?

上一节,从查询推荐的业务需求出发,介绍了编辑距离的概念,今天我们要基于此,来获得状态转移方程,然后才能进行实际的编码实现。

qq_37756660的博客 1727

动态规划模式

动态规划是一种通过将问题分解成小问题并利用已解决的小问题来避免重复计算的技术。其核心思想是使用状态表示问题的不同阶段,并通过状态转移方程来递推求解。在实际应用中,动态规划非常适用于具有“最优子结构”和“重叠子问题”特征的问题,常见的问题有背包问题、最长公共子序列、矩阵链乘法等。

qq_43287763的博客 1325

动态规划的常用状态转移方程总结

动态规划的常用状态转移方程总结

前端工作学习中 3630

递推求解算法

先来看一个简单的问题: 有5人坐在一起,当问第5个人多少岁,他说比第4个人大2岁,问第4个人多少岁,他说比第3个人大2岁,依次下去,问第一个人多少岁,他说他10岁。请问:第5个人多少岁? (如果所坐的不是5人而是n人,请写出第n个人的年龄表达式。) 常见的数学公式:f(n) = 10 + (n-1)*2 递推公式(状态转移方程): f(1)=10 f(n)=f (n-1)+2 ( n > 1 ) Fibnacci 数列 f(1)=1 f(2)=1 状态转移方程: f(n)=f

m0_57587757的博客 1284

动态规划-用集合的角度推导状态转移方程 — 最长上升子序列(LIS)

在动态规划(Dynamic Programming, DP)中,状态转移方程是解决问题的关键。对于**最长上升子序列(Longest Increasing Subsequence, LIS)问题,除了传统的逐步推导 数组的方法外,我们还可以从集合(Set)**的角度来理解和推导状态转移方程。这种方法不仅有助于深入理解问题的本质,还能为进一步优化提供理论支持。目标:给定一个由整数构成的序列 ,找到其中最长的严格递增的子序列,并返回其长度。示例: 最长上升子序列长度:4(例如 或 )首先,我们需要重新定义动

Jerry的博客 1240
上一篇: 栈和堆都能动态或静态分配内存空间吗?
下一篇: 递归究竟是什么?如何快速编写正确的递归代码? —— 力扣经典面试题详解
小白debug~
小白debug~ 新星创作者: C/C++技术领域 新星创作者: C/C++技术领域
博客等级 码龄4年 3510粉丝 128原创
评论 32
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白debug~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值