- 博客(36)
- 收藏
- 关注
原创 【动态规划】01背包问题 背包问题
"背包问题"用我的语言简单来讲就是把物品放入背包后,背包中物品价值的最大值,每放入一个物品占用一定背包体积;在这里物品的属性有"价值(W)""体积(V)",背包的属性有"体积(V)"。对于体积,题型可分为"背包一定装满"和"背包不一定装满"两类题;对于可放入物品的个数,题型可分为"所有物品只能拿一次"(01背包问题)和"所有物品可以拿任意次"(完全背包问题),在所有题型中的潜规则就是放入物品的总体积不能超过背包体积!以上情况可以两两组合罗列题目。
2023-09-02 11:21:00
100
原创 【动态规划】多状态dp问题 买卖股票的最佳时期3
本题与我们做过的"买卖股票"类问题一样,有"买入"和"卖出"两个状态,本题中多了一个交易次数的条件,规定可以有0次,1次,2次交易,我们规定卖出股票后就完成了一次交易。接着分析状态,当手里有无股票时有"买入""卖出"两种状态,分析交易次数时有0 ~ 2次,所以我们用二维数组结合多状态dp来设置状态。其中f[ i ][ j ]表示在第 i 天处于"买入"状态下第 j 次交易时,所得利润的最大值;g[ i ][ j ]表示在第 i 天处于"买入"状态下第 j 次交易时,所得利润的最大值。
2023-09-01 17:25:45
78
原创 【动态规划】多状态dp问题 买卖股票的最佳时机含手续费
此题的状态有"买入"、"卖出"两个状态,我们用两个dp表分别记录这两个状态下第 i 天的状态信息,此题多了一个条件就是手续费,一次完整的"买入"和"卖出"交一次固定的手续费fee,所以我们规定在从"买入" 到 "卖出"时交手续费。下来我画出状态转化图方便状态方程的分析。
2023-08-31 16:58:32
97
原创 【动态规划】多状态dp问题 买卖股票的最佳时期含冷冻期
此题的状态比较多,有"买入"、"卖出"、"冷冻期"共三个状态,我们可以设置三个dp表分别记录状态信息,也可以开辟一个二维数组大小为 i 行 3 列,其中三列分别表示"买入"、"卖出"、"冷冻期"三种状态,i 行就代表在第 i 天;我们用二维数组这种方式来分析状态方程。
2023-08-31 15:27:51
59
原创 【动态规划】多状态dp问题 删除并获得点数
我们换个角度分析题意,偷取nums[ i ]的点数时就不能偷取nums[ i ] - 1和nums[ i ] + 1的点数,按这样的条件约束偷完整个数组返回偷到的最大点数,听起来是不是像我们做过的打家劫舍问题,题目约束不能偷取相邻房屋,这里是不能偷取相邻的数字;但是题目提供的数据不一定是严格相邻的,比如nums = {1,1,1,1,3,3,3,3,5,5,9,9,11},我们发现1和3并不相邻偷完1也可以偷3,所以我们必须在连续相邻的下标下使用打家劫舍的解题思路。
2023-08-30 20:41:32
42
原创 【动态规划】多状态dp问题 打家劫舍
分析此题目时我们先用原先的经验,我们设状态dp[ i ]为当小偷偷到第 i 家时能够偷到最高的金额,但是题目要求不能偷取相邻的房屋,这就导致我们不确定第 i 家是偷还是不偷,所以原先设置的状态不能推导出状态方程,因此我们可以发现:在研究 i 位置时若存在多个状态时,我们设置多个dp表存放不同状态下各个位置的信息,我们另设f[ i ]为选择偷取第 i 家能够偷到最高的金额,设g[ i ]为选择不偷取第 i 家时能偷到最高的金额。我们再根据题目限制条件对这两个状态列不同的状态方程。
2023-08-30 19:57:06
34
原创 【动态规划】二维数组的dp问题 两个字符串的最小ASCII删除和
此题目要求获得两个字符串在删除部分子序列后相等时,删除子序列ASCII值的最小和。我们正着分析题目时,发现题目的约束条件有很多时不容易分析时我们在反向推导题目。求的是删除的子序列ASCII值的最小和,反过来剩下的相同序列ASCII值就是最大和,以这个思路继续分析,整个题目的求解方法就与"最长公共子序列"相同了,所以首先我们得保证求出两个字符串的公共子序列,其次要求公共子序列一定是最长的,只有最长的公共子序列ASCII值的和才是最大的。
2023-08-29 15:11:33
32
原创 【动态规划】二维数组的dp问题 交错字符串
此题我们将"子数组类型"问题与"两个序列的dp问题"结合起来,题目中要求是用s1和s2的子串交错形成字符串s3,题目中的重点是"子串"和"交错形成"。"子串"意思为字符串中一段连续的子字符串,和"子数组"一样重点是连续;"交错形成"意思为用完s1的字串后接着用s2的子串拼接,在运行实例时,可以出现s1(s2)是空串,s3与s2(s1)相等的情况;但是不能出现s1和s2不是空串,s3却和s1或s2相等的情况,换言之s3必须由s1和s2的子串交错形成(开始是s1还是s2无所谓)。
2023-08-29 14:34:14
40
原创 【动态规划】二维数组的dp问题 不同的子序列
此题要求在字符串s的子序列中计算字符串t出现的次数,我们继续用"子序列问题"的思想在一段区间中分析状态,然后以某一位置为结尾分析状态方程。用二维数组存放字符串s以 i为结尾的区间的状态和字符串t以 j为结尾的区间的状态,dp[ i ][ j ]表示字符串s以 i为结尾的子序列中有多少个字符串t以 j结尾的子序列,注意题目要求"在字符串s的子序列中计算字符串t出现的次数",看上去只要求算出有多少 t字符串出现就可以,但是对t 子序列的统计才能辅助得到最终结果。
2023-08-28 20:39:17
92
原创 【动态规划】二维数组的dp问题 最长公共子序列
正如本文标题"两个序列的dp问题"一样",本题的题意大致意思就是求s1与s2公共的子序列中最长的长度,所以要用二维数组来分别表示s1字符串确定位置的状态和s2字符串确定位置的状态。此题我们分析状态时要在一段子序列中分析,但是在最后状态方程的拟定时还是要以最后一个位置的元素做判断。所以dp[ i ][ j ]表示s1以 i结尾的子序列和s2 以j结尾的子序列中,公共子序列的最长长度。
2023-08-28 17:48:43
57
原创 【动态规划】回文串类型问题 最长回文子序列
此题将"回文串类型"题目与"子序列类型"题目结合起来,如果用dp[ i ]表示最长回文子序列的长度,那么在状态方程中我们无法确定子序列是否是回文串,所以用dp[ i ][ j ]表示在i ~ j 区间内所有的子序列中最长回文串的长度。这道题的思路不能放在"以某一位置为结尾"研究,而是要放在"某一段区域中"做研究,在这一段区域中才能判断出那一个子序列属于回文串。
2023-08-25 23:16:44
30
原创 【动态规划】回文串类型问题 分割回文串2
此题我们用"回文字串"的方法辅助"单词拆分"的思想来解决,我们设dp[ i ]为以 i 结尾的子串切割为回文串时最少的切割次数,但是在填dp表的前提是我们是否知道以 i 结尾的子串是否为回文串,不是才进行切割。所以我们将所有子串是否为回文串的信息保存在二维数组isPal表中,这里保存的方法就是"回文字串"的解题方法。
2023-08-24 20:20:18
31
原创 【动态规划】回文串类型问题 回文子串
回文串通俗来讲就是正着读反着读得到的结果一样,其中0位置与n-1位置相同、1位置与n-2位置相同以此类推,这条经验也是回文串问题的重要判断条件。接下来我介绍几种特殊的回文串。
2023-08-24 11:50:09
52
原创 【动态规划】子序列类型问题 最长等差数列
关于 i 位置确定后 j 位置的枚举通常有3种常用的遍历方式:除了常见的从左往右的填表顺序,还有二维数组dp表从上到下的填表方式还有回文串问题从左到右的填表顺序。
2023-08-23 18:32:26
51
原创 【动态规划】子序列类型问题 最长的斐波那契子序列长度
在以往子序列的题目中我们都是在题目条件的约束下确定一个变量的遍历情况从而找出最合适的子序列,多个变量在遍历时状态不能准确表示,所以当出现多个变量时我们的状态表示就要多一维分析,保证只剩下一个变量在区间内遍历。
2023-08-23 16:27:10
44
原创 【动态规划】子序列类型问题 最长定差子序列
这道题如果我们用常规思路来解决,方法与"最长递增子序列"的解法一致,无非就是把判断条件改为 if(arr[i] - diff == arr[j]),但是这个题目的数据量为:所以用O(n方)的时间复杂度解决最后就会导致超出时间限制,所以我们必须换一个思路。在"最长递增子序列"一题中,我们在确定dp[i]位置然后向前找合适的dp[j]位置时,对于 j 的位置和对应数值我们都是不知道的,所以才要遍历0 ~ j区间的所有数。
2023-08-23 12:36:36
29
原创 【动态规划】子序列问题 最长递增子序列的个数
这里更新len[i] 最长长度同样重要,长度的更新是辅助个数更新的,一旦长度更新有误最后的返回结果一定是错误的。
2023-08-23 10:44:47
34
原创 【动态规划】子序列类型问题 最长递增子序列
子序列和子数组的概念很像,但是又有一些区别,子数组是在题目要求的数组中找出一段按照顺序的、连续的子数组区间;而子序列是在题目给出的序列中(可能是数组可能是字符串)找出一段按照一定顺序的、可以不连续的子序列区间。不难发现子序列最大的特征正是可以不连续,所以在分析状态方程时,我们通常分析以 i为结尾的状态时通常是要研究 j ~ i 区间内可能出现的情况,不能像子数组的题一样只根据 i - 1位置的状态辅助分析 i位置的状态。
2023-08-22 17:01:32
53
1
原创 【动态规划】 子数组类型问题 等差数列划分
此类问题我们通常用三项或三项以上的元素项来研究,如果nums[i] - nums[i-1] == nums[i-1] - nums[i-2],那么我们就把这三项看作一个等差数列,如果在这之后紧跟的项的公差等于前三项的公差,则这四项也构成等差数列;若这之后紧跟的项的公差不等于前三项,那么在这项之后的项均与前三项不构成等差数列。
2023-08-21 20:48:10
32
1
原创 【动态规划】子数组类型问题 乘积为正数的最长子数组长度
此题的大致思路与"乘积最大子数组"一致,不同的是对于nums[i] < 0时的状态方程分析,因为所求是乘积为正数时最长子数组的长度,所以不能用"乘积最大子数组"的方法在循环中统一填表,而是在nums[i] > 0 或 nums[i] < 0下分类讨论,在不同的条件下进行填表;并且nums[i] < 0的条件下0 ~ i-1的乘积恰好为负,计算下来0 ~ i的长度就是最长长度,所以不难发现还需要建立一个dp表记录乘积为负数最长子数组的长度来辅助。
2023-08-21 16:59:09
59
1
原创 【动态规划】子数组问题 乘积最大子数组
如题目所述求子数组乘积的最大值,因为乘法中负数 * 负数等于正数,所以我们不能确定 i 位置的数是正是负,也不能确定0~i-1 位置中的乘积是正是负,所以单一的状态是无法分析得到结果的,因此我们在分析状态时不仅要记录最大乘积和,也要记录最小乘积和。
2023-08-21 15:24:45
66
1
原创 【动态规划】子数组类型问题 环形子数组的最大和
此题的大致思路与"最长子数组"的思路相似,但是不同的是首尾可以相互连续,这就导致最长子数组的和可能在0~n-1之间,也有可能是首尾两端连续区间,所以正着分析很麻烦,因此遇到环形数组问题时"正难则反"。
2023-08-21 14:21:45
64
1
原创 【动态规划】子数组类型问题 最大子数组和
子数组就是在题目提供的数组下,找出一个符合题意的连续的部分的数组,这里的连续很重要,关乎着状态方程的分析以及边界条件的处理,这类题目着重分析当前位置和这个位置前一个位置的状态,要注意同一个位置可能有多种不同的状态。
2023-08-19 16:51:21
42
原创 【Linux进程概念】 (4)进程地址空间
我们在编写C代码时往往出现一个错误就是变量地址的非法访问和使用,如果此时的地址对应内存中真实的物理地址,那么我们造成的多数错误可能会导致系统崩溃。所以关于地址空间的分布不是我们想象的那么简单,接下来我将从什么是地址空间,地址空间是如何设计的,还有为什么要有地址空间这三个角度来讲述。
2023-02-28 20:09:41
195
原创 【Linux进程概念】 (3)进程在CPU中的切换与环境变量
这一章我将着重介绍除进程状态外的其他进程相关概念,并介绍如何理解使用进程中的环境变量。
2023-02-26 20:58:04
188
原创 【Linux进程概念】(2)进程在系统中的组织和状态
在上一章中我浅浅的抛出一个结论就是,操作系统管理的本质就是对对象的数据做管理,而管理的本质就是对符合描述的数据在系统内形成相应的数据结构。这一章我将站在操作系统的角度,反观进程在系统中的组织和状态并介绍子进程的创建。
2023-02-20 23:15:38
102
原创 【Linux进程概念】(1)浅谈操作系统
操作系统,这个东西可能让我学到入土也不能驾轻就熟的掌握其中的内涵,在这里我只能站在一个初学者的角度,浅谈我对操作系统中冯诺依曼体系结构以及为什么要有操作系统?和操作系统对文件是如何管理?这些问题见解。
2023-02-16 22:37:40
97
原创 【Linux基础开发杂谈】 代码的翻译过程
学习和使用这么长时间的C语言,我们是否想过计算机会直接识别我们的C代码吗?或者说计算机对我们的代码进行悄咪咪的操作后我们的C代码还是原来的模样吗?
2023-02-15 17:54:22
169
原创 【Linux基础指令与权限】(2)文件权限
Linux系统下对于用户的操作有着严明的权限规定,接下来我将从用户角度,目录角度和文件角度来阐述如何理解系统权限,最后再介绍一下与文件权限相关的umask和粘滞位。
2023-02-13 22:50:02
227
原创 指针~第一幕【用牛角包和盘子来解释指针】
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 文章目录 前言 一、地址是什么 二、指针是什么 前言指针,听起来很高大上吧,毫不夸张的说在我才了解到指针这一词时,我本以为就是学习操作屏幕上的鼠标指针……经过初阶的学习后对当时的天真感到很尴尬。指针这东西确实麻烦但不难理解,接下来我用盘子、牛角包、和手来解释指针和指针应该怎么用。一、地址是什么 首先我们先来了解地址。我们在写程序时,写...
2022-03-21 13:03:47
572
原创 致那年我们学过的C
呐~初次见面,请多关照,古人发牢骚时总说“曾经沧海难为水,除却巫山不是云”,在我这儿却成了“取次花丛懒回顾,半缘修道半缘C”。身为计算机专业的学生总是徘徊在牛皮哄哄的啥都会和“唉那谁,给我修下电脑。”、“啊?我不会吖。。”之间,而我是牛皮哄哄的啥也不会……。说实话,当时报专业时,我不是为了什么理想和事业,就是为了哪个赚钱选的计算机专业,对于计算机的了解我也只是仅限于复制粘贴和英雄联盟……,在没有了解到计算机知识和编程之前,我只是觉得计算机只是以后赚钱的工具,但在大学一年的学习后,我才真正发掘...
2021-12-28 00:07:34
455
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人