自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(73)
  • 收藏
  • 关注

原创 【区间dp】-----例题3【石子合并】

/ 1.状态定义:// dpmax[i][j]:表示将区间 [i..j] 的石子合并为一堆所能获得的最大代价// dpmin[i][j]:表示将区间 [i..j] 的石子合并为一堆所能获得的最小代价含义:把线性区间ij[i,j]ij内的所有堆合并成一堆,能得到的最小合并总代价。1≤i≤j≤2n1≤i≤j≤2n,但我们只关心当j−i1≤nj-i+1\le nj−i1≤n时的值。含义:同上,但表示能得到的最大合并总代价。为何双表?

2025-05-19 22:11:32 97

原创 【区间dp】-----例题2【最长回文子串】

子串(Substring)要求字符连续且顺序不变;例如"aba""bb"都是回文子串。回文(Palindrome)正着读和反着读完全相同;例如"aba""racecar"。给定一个字符串s,找出其中最长的回文子串,并返回其长度。我们使用一个大小为n×n的布尔矩阵dp,其中。// dp[i][j] 含义:子串 s[i..j] 是否为回文// 取值:// dp[i][j] = true, 当且仅当 0 ≤ i ≤ j < n 且 s[i..j] 整体是回文。

2025-05-19 20:13:26 311

原创 【区间dp】-----例题1【最长回文子序列】

子序列(Subsequence)从字符串中删除任意个(也可以不删)字符后得到的新字符串;不要求连续,但要求相对顺序不变。回文(Palindrome)正着读 = 反着读;比如:“aabaa”, “abcba”找出字符串中最长的“回文子序列”的长度。dp[i][j]:表示从下标i到j的子串s[i..j]中,最长的回文子序列长度。dp[0][4] 就是求 s[0…4] = “bbbab” 里的最长回文子序列长度枚举区间长度时从小到大,因为小区间是大区间的子结构,必须先算好。

2025-05-18 22:32:50 710

原创 【背包dp】小结

多个物品选几个,容量限制是核心;选或不选看约束,价值最大找最优;可重复用正序扫,只能选一次就倒流;多重拆成 0-1 背,分组记得内部分组选。

2025-05-18 14:46:46 765

原创 【背包dp-----分组背包】------(标准的分组背包【可以不装满的 最大价值】)

dp[i][j]表示从前i个物品组中,在总容量恰好为 j 的情况下所能获得的最大价值。外层循环:遍历物品组对于每一个物品组(从第1组开始),获取该组的所有物品。继承上一组的状态在处理当前组之前,先继承前一组的状态(即假设不选择当前组中的任何物品),确保基础状态正确。中层循环:遍历当前组内的每个物品对于当前组中的每一个物品,计算其对背包的影响。最内层循环:遍历背包容量对于当前物品,遍历所有可能的背包容量,并根据当前物品的重量和价值更新dp数组。

2025-05-17 21:54:01 1052

原创 【背包dp----01背包】例题7------(01背包变种【子集划分问题】)

我们定义一个二维布尔数组dp[i][j],表示:前i个物品中,是否可以选出若干个物品,使得它们的总和正好等于ji的范围是[0, 40]j的范围是[0, sum]内容说明核心思想将问题转化为 0-1 背包问题,寻找最接近sum/2的子集DP 数组定义dp[i][j]表示前i个物品能否凑成总和j状态转移or最终答案遍历所有可达的j,取j*(sum-j)的最大值优化建议可以使用滚动数组优化空间,压缩为一维 DP我们定义一个一维布尔数组dp[j],表示:是否可以从前i。

2025-05-15 19:17:51 929

原创 【背包dp----01背包】例题6------(变种01背包4 【判断某种价值是否可达】)

我们定义dp[i][j]表示前i道题中,经过任意选择,能否恰好得到分数j。如果,说明可以通过选择前i道题中的若干题,得到总分为j。如果,说明不能组成这个总分。项目内容题型子集和问题 / 0-1 背包变种动态规划类型二维布尔数组状态定义dp[i][j]:前i道题能否组成总分为j初始化状态转移关键技巧使用bool数组表示“可达性”,避免冗余计算我们定义dp[j]表示:经过若干选择后,能否得到总分为j。如果,说明可以通过选择一些题目,得到总分为j。如果,说明不能组成这个总分。

2025-05-13 22:00:10 741

原创 【背包dp----完全背包】例题2-----(完全背包变种2【求恰好装满的 方案数】)

dp[i][j]表示从前 i 个物品中任选若干个(可重复选),使得它们的总价值恰好为 j 的方案总数。dp[j]表示:当前处理到第 i 个物品时,总价恰好为 j 的方案数。含义不变:表示从前i个物品中选出若干个,使得总价值恰好为j的组合方式数量。

2025-05-13 20:11:20 836

原创 【背包dp----多重背包】例题1------(标准的多重背包【不要求恰好装满背包体积 产生的 最大价值】)

dp[i][j]表示从前 i 个物品中任选若干个(每个物品最多选 x[i] 次),使得它们的总重量恰好为 j的最大价值。dp[j]:容量为j的情况下,所能获得的最大价值。dp[0] = 0,其余为INT_MIN最终答案:从dp[0]到dp[T]中取最大值。

2025-05-12 22:29:25 862

原创 【背包dp----完全背包】例题1------(标准的完全背包【恰好装满背包体积 产生的 最大价值】【可以不装满 产生的 最大价值】)

我们定义一个二维数组dp[i][j]表示:前i个物品中选择若干物品(每个物品可选多次),恰好填满体积为j的背包时,可以获得的最大价值。初始状态是整个动态规划过程的起点,表示“不选任何物品,刚好填满体积为 0”的合法状态;其余状态初始化为INT_MIN表示不可达,避免从无效状态进行转移。项目内容题型完全背包动态规划类型二维数组 + 三重暴力循环状态定义dp[i][j]:前i个物品,体积为j时的最大价值状态转移枚举第i个物品选k次的情况关键技巧使用INT_MIN标记无效状态,防止无效转移。

2025-05-12 21:48:18 72

原创 【背包dp----01背包】例题4、5------(变种01背包2【恰好装满背包体积 产生的 所有方案数】【不要求恰好装满背包体积 产生的 所有方案数】 )

在本题中,我们通过定义dp[i][j]表示前i个物品中选出若干个,总价恰好为j的方案数,利用动态规划的状态转移思想,将每一步的选择(选或不选)转化为数学上的加法运算,从而高效地求解了恰好花完m元的所有合法方案数。

2025-05-09 09:11:19 565

原创 【背包dp----01背包】例题3------(标准的01背包+变种01背包1【恰好装满背包体积 产生的 最大价值】)

dp[i][j] 表示前 i 个物品中选择若干物品,装满容量为 j 的背包中 可以获得的最大价值。这个状态定义规定容量j填满当前背包容量,与标准的01背包问题略有不同✅ 推荐使用隐式初始化(只设置),并从j=0开始遍历,这是最标准、最安全、最通用的做法。✅ 如果你选择从j=1开始遍历(即跳过j=0),那么你就必须显式地设置所有,否则会导致一些本应可达的状态被误判为不可达。dp[i][j] 表示:从前 i 个物品中选择若干物品,使得它们的总体积恰好等于 j,可以获得的最大总价值。

2025-05-07 23:04:32 542

原创 【背包dp----01背包】例题2------携带研究材料(标准的01背包问题)

我们定义一个二维数组dp[i][j]表示:只考虑在前i个物品中任选一些物品 放入容量为 j 的背包时,能够获得的最大总价值。前 1 个物品,在容量 j 下的最大价值;前 2 个物品,在容量 j 下的最大价值;前 n 个物品,在容量 vs 下的最大价值(这就是我们要求的答案)。步骤内容问题类型0-1 背包问题动态规划类型二维 DP子问题定义dp[i][j]表示只考虑在前i个物品中任选一些物品 放入容量为 j 的背包时,能够获得的最大总价值。状态转移选或不选第i个物品,取最大值。

2025-05-07 20:57:12 846

原创 【背包dp----01背包】例题1------[NOIP2001]装箱问题(简化的01背包----体积就是价值)

设dp[i][j]表示从前i个物品中选择若干装入体积为j的箱子时,所能使用的最大体积。我们的目标是:找出dp[n][vs],即使用了全部物品后,在体积为vs的箱子中能装下的最大体积,用得到最小剩余空间。步骤内容状态定义dp[i][j]表示从前i个物品中选择若干装入体积为j的箱子时,所能使用的最大体积状态转移当当j < v[i]初始条件第0层根据第0个物品体积初始化最终答案时间复杂度O(n×vs)空间复杂度O(n×vs)设dp[j]表示当前处理到某个物品时,在容量为j。

2025-05-06 16:46:12 834

原创 【二维dp】例题1------数字三角形 Number Triangles

设dp[i][j]表示从金字塔顶部走到第i行第j列时的最大路径和。我们的目标是:找出dp[n][j]中的最大值(即最后一行中的最大路径和),其中n是层数。步骤内容状态定义dp[i][j]表示到达第 i 行第 j 列的最大路径和状态转移初始条件最终答案取最后一行的最大值时间复杂度O(n²)空间复杂度O(n²))使用滚动数组优化的一维 DP 数组dp[j]表示:当前处理到第i层时,到达第j列的最大路径和。我们不需要保存每一层的状态,只需要用一维数组模拟即可。项目内容题目。

2025-05-05 21:48:38 983

原创 【动态规划】Day01------基本原理与一般解题步骤

我的状态是什么?我的转移怎么写?我的初态是什么?我的终态在哪里?

2025-04-27 09:26:31 482

原创 【java面型对象进阶】------继承实例

【代码】【java面型对象进阶】------继承实例。

2025-03-19 22:34:36 237

原创 【java面向对象进阶】------继承

在面向对象编程中,子类的构造方法具有以下特点:默认调用父类无参构造方法子类的每个构造方法中都会默认包含一个super(),用于调用父类的无参构造方法。这是隐式行为,确保父类的成员变量先被初始化。手动调用父类构造方法如果子类显式调用父类的构造方法(如super(参数)),则会覆盖默认的super()。通过super(参数),可以根据参数的类型和数量调用父类中对应的构造方法。super()和this()的使用限制super()用于调用父类的构造方法,this()用于调用当前类的其他构造方法。

2025-03-19 00:15:27 311

原创 【java零碎知识点】------返回值类型的大小排序

在 Java 中,主要涉及的继承关系,而不是基本数据类型。

2025-03-17 23:04:54 331

原创 【java面向对象基础】--------综合训练1(文字游戏)

【代码】【java面向对象基础】--------综合训练1(文字游戏)

2025-03-09 23:12:08 172

原创 【java面向对象进阶】------static关键字 与 工具类

在 Java 中,类和对象是面向对象编程的核心概念。在类中定义的成员变量,如 name、age、sex,是每个对象独有的属性,每个对象都可以访问和操作这些变量。然而,某些属性应该是类级别的,而非对象级别的。例如,所有学生的学校名称相同,这类信息应属于类本身,而不是每个单独的对象。Java 通过 static 关键字来区分类和对象的成员,使得 static 修饰的成员属于类本身,而未被 static 修饰的成员属于对象。静态变量 是对象共享的 在内存中只有一份 谁要用 谁去拿。

2025-03-07 16:53:42 722

原创 【java面向对象基础小结】

用于区分成员变量和局部变量,或者在构造方法中调用其他构造方法。封装是面向对象编程中的重要特性,它通过 private。隐藏类的内部实现,并提供 public。在 Java 中,使用。来访问和修改成员变量。在实例方法中,this。

2025-03-07 15:37:51 190

原创 【java面向对象基础】-------内存分析

jdk7以前,方法区与堆连在一起这里的元空间我们就将其理解为即可。

2025-03-05 17:50:58 643

原创 【java面向对象基础】-----类,对象,封装与构造器

构造方法(Constructor)是用于创建类的对象时自动调用的方法。在 Java 中,构造方法用于初始化新创建的对象它的名字与类的名字相同并且没有返回类型(即使是void也不能声明)构造方法的主要作用是为对象的成员变量赋初始值确保对象在创建时处于一个有效的状态。

2025-03-05 16:17:20 836

原创 【Java基础语法】------基本元素 与 项目结构

​ 变量就在程序中临时存储数据的容器。但是这个容器中只能存一个值。数据类型变量名数据值;//1.定义byte类型的变量//数据类型 变量名 = 数据值;//2.定义short类型的变量//3.定义int类型的变量int c = 30;//4.定义long类型的变量//5.定义float类型的变量//6.定义double类型的变量//7.定义char类型的变量//8.定义boolean类型的变量注意如果要定义 一个整数类型。

2025-02-26 19:37:36 1008

原创 【java基础语法】----java相关特性

JDK(Java Development Kit):提供了开发工具和JRE,用于开发与运行Java 程序。适合开发者使用。JRE(Java Runtime Environment):提供了运行 Java 程序所需的JVM和核心类库,不包括开发工具,适合于运行程序的环境。JVM(Java Virtual Machine):负责执行Java 程序,是 Java 程序运行的核心。因此,开发者在开发 Java 应用时需要使用JDK,而普通用户或服务器部署时只需要JRE,JVM 是二者共用的执行环境。

2025-02-25 17:29:14 533

原创 【平衡二叉树的平衡调整-----------理论】

根据平衡二叉树的定义,平衡二叉树上所有结点的平衡因子只能是以下三种情况-1:结点左子树的高度小于结点右子树的高度0:结点左子树的高度等于结点右子树的高度1:结点左子树的高度大于结点右子树的高度。

2024-10-15 17:30:03 1826 2

原创 【树表的相关查找算法】-----二叉排序树

返回值:查找成功返回指向该结点的指针,否则返回NULL参数:T是二叉排序树的指向根结点的指针,key是要查找的关键字参数:参数:T 是指向二叉排序树的根结点指针的 二级指针注意递归调用时,使用(*T)的地址 即&(*T)(1)递归终止条件:如果当前树节点为空 (*T 为 NULL),则返回 false,表示没有找到待删除的关键字或树本身为空。(2)(2.1)如果待删除的关键字 key 大于当前节点的关键字,则递归到当前节点的右子树进行删除。

2024-10-08 09:36:44 153 2

原创 【查找算法概念】与【线性表的相关查找算法】

以查找21成功为实例:中点值大于key,缩短上半区间中间值小于key,缩短下半区间找到key值以非递减有序排列。

2024-10-07 17:46:09 1210 1

原创 【STL】priority_queue 基础,应用与操作

/ 定义一个存储 int 类型的优先级队列(默认最大堆)默认情况下,priority_queue 是一个最大堆,但可以通过自定义比较器将其变为最小堆。通过指定比较函数,可以改变元素的排列顺序。priority_queue 是C++ STL中一个强大的容器适配器,**用于处理需要频繁访问优先级最高(或最低)元素的场景。**通过了解其基本操作、自定义排序规则以及底层实现机制,开发者可以更加灵活地应用它来解决各类优先级相关的问题。不过,也要注意其一些限制,如无法直接遍历和修改元素优先级。

2024-09-19 20:56:21 976 2

原创 【STL】string 基础,应用与操作

STL(标准模板库)中的string容器是C++标准库提供的用于处理和操作字符串的类,位于头文件中。std::string提供了比传统的C风格字符串(字符数组)更方便和安全的功能,具有动态内存管理、丰富的操作函数和良好的兼容性。std::string可以自动调整其大小,允许存储任意长度的字符串。它会根据需要分配内存,并在需要时扩展,不需要程序员手动管理内存。这种特性大大降低了内存管理的复杂性,避免了手动管理C风格字符串可能导致的缓冲区溢出问题。// 自动扩展内存以存储更长的字符串。

2024-09-19 20:27:31 1409

原创 【STL】stack,deque,queue 基础,应用与操作

stack(栈)栈是一种后进先出(LIFO, Last In First Out)的数据结构,意味着最后插入的数据最先被移除。C++ 中的栈是通过容器适配器实现的,底层默认使用 deque(双端队列)来实现,也可以选择 vector 或 list 作为底层容器。数据结构:后进先出(LIFO,Last In First Out),意味着最后插入的元素最先被移除。底层实现:stack 是一个容器适配器,默认底层使用 deque 实现,可以替换为 vector 或 list。

2024-09-19 16:33:55 1260

原创 【STL】vector 基础,应用与操作

vector 是一种动态数组,它能够根据需要自动调整自身的大小。它允许快速随机访问,并且能在末尾进行高效的插入和删除操作。支持随机访问,时间复杂度为 O(1)。动态分配内存,自动扩展存储空间。插入和删除操作在末尾处效率最高。for_each();创建临时 vector:创建一个新的临时 vector,它仅分配了与 vec.size() 相同的内存(即刚好能存储当前的元素),而不保留多余的空间。swap() 交换内部结构。

2024-09-19 11:15:30 1477 4

原创 【STL】pair 与 map:基础、操作与应用

pair 是 C++ 标准库中的一种数据结构,它允许我们将两个不同类型的数据组合成一对。它的典型用法是用来返回两个相关联的值,例如姓名和电话号码。每个 pair 包含两个值,这两个值分别可以通过 .first 和 .second 访问。map 是 C++ 中的一种关联容器,通常用于存储键值对。每个元素都是 pair,其中第一个元素为 键(key),第二个元素为 值(value)。map 容器的特点是:所有元素会根据 键 的大小自动排序,并且 键值唯一。如果需要允许重复键,可以使用 multimap。

2024-09-17 17:07:20 1955

原创 【STL】 set 与 multiset:基础、操作与应用

如果需要按自定义顺序排序 set 中的元素,可以通过传入自定义的比较器来改变排序方式。例如,可以使用 greater 来实现降序排列,或者提供自定义的比较函数。print2(s);// 输出:30 20 10。

2024-09-16 21:58:09 1849

原创 【C++知识扫盲】------初识命名空间

是用于访问 C++ 标准库符号的前缀,避免命名冲突。虽简化了代码,但在复杂项目中可能引发命名冲突。可以选择只引入特定符号,以在代码简洁和命名空间安全之间取得平衡。

2024-09-16 14:38:41 232

原创 【C++知识扫盲】-----初识迭代器

迭代器是一种抽象的指针类型,它使得你可以遍历容器中的元素而不需要知道容器的具体实现细节。迭代器可以用来访问容器中的元素、移动位置、比较位置等。

2024-09-14 22:14:17 300

原创 【C++知识扫盲】------C++ 遍历方法与 auto 关键字

传统 for 循环:适用于有索引的容器。range-based for 循环:简洁且适用于所有标准容器。迭代器遍历:适用于需要灵活控制的遍历。

2024-09-14 21:02:00 644

原创 【C++知识扫盲】------C++ 中的引用入门

引用本质上是某个变量的别名。在此例中,print 函数通过常量引用避免拷贝 std::string,但同时保证字符串不会被修改。注意:不要返回局部变量的引用,因为局部变量在函数返回后被销毁,引用将指向无效内存,导致未定义行为。在此例中,getMax 函数返回两个参数中较大值的引用,允许我们修改这个值。在这个例子中,swap 函数使用引用交换两个变量的值,而无需创建副本。常量引用常用于函数参数传递,保证传入的对象不会被修改,同时避免拷贝。引用在使用时不需要解引用,而指针需要使用 * 来访问指针指向的值。

2024-09-14 21:01:05 535

原创 【二叉树遍历算法应用】------补录

但要复制成的新树,应传入结点指针的地址,即二级指针,因为要修改结点指针的值(指向新开辟的结点空间):原本存在的树只是会遍历,不会被修改,故传入一级指针。:只进行遍历,不会修改树的结构,故传入一级指针。

2024-09-14 15:08:24 948

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除