当前位置: 首页 > 网络应用技术

摘要:动态计划,这些问题的最高频率!

时间:2023-03-08 14:19:40 网络应用技术

  尽管从整个动态计划的频率的角度来看,动态计划的范围确实非常困难,但这些基本的动态计划理解很容易,学习不高,并且频率看起来很高。

  这些常见的动态计划是:连续子阵列的最大总和,子阵列的最大乘积,最长的增量子序列(LIS),最长的公共后续序列(LCS),最长的公共次级次级序列,最长的公共次数,最长的公共子弦,不同的子序列。

  首先,许多人问,什么是动态计划?动态编程(DP)是运营科学的分支,是否解决了战略过程的优化过程。受欢迎的动态计划是求解从底部到顶部的值(从从前到后)。

  那么,动态计划和递归之间有什么区别和联系?

  总的来说,动态的计划始终是向前,向后和向前的。这两种策略是不同的,并且一般的动态计划效率高于递归。

  但是,他们必须考虑初始状态与上部和下数据之间的联系。许多可以解决动态计划可以解决的问题,但可以通过递归解决,但很多时候可以将效率用于内存搜索。

  不明白?

  例如,如果使用配额配额,则未直接使用递归进行优化,则将计算出大量重复计算。

  但是,您可以将其理解为带有内存的缓存层,并且可以下次遇到它直接使用它。

  实现纤维纳代码的内存搜索是:

  动态计划方法可以从向后逻辑处理,每个DP是第三个DP的总和。

  当然,动态计划也可以进行大量空间优化。有些人只使用一次,您可以使用一些变量来替换。两个维数阵列也可以用一个维数阵列替换。当然,动态计划主题非常大。有许多,例如树状的DP,外观压力DP,背包问题等。经常出现在比赛中。这里有限的功能将进行一些动态计划,并进行高频书面测试!

  给定整数数组数字,找到一个最大串行数组(子阵列包含至少一个元素),然后返回其最大总和。

  例子:

  输入:[-2,1,-3,4,-1,2,1,-5,4]输出:6说明:连续性数组的总和[4,-1,2,1]为6。

  DP的方法是O(n)的方法。IFDP [I]表示末端I的最大序列,并且该DP的状态方程为:

  不难解释的是,如果前一个是最大的子序列,大于0,则连接到该元素,否则该元素将独立存在。

  实施代码是:

  PS:一些朋友问,非连续阵列的最大数组是什么?您考虑到正收入袋,这个问题毫无意义。

  给您一个整数数组数,请找出数组中最大的连续子阵列(在子阵列中至少一个数字),然后返回与子阵列相对应的产品。

  例子:

  输入:[2,3,-2,4]输出:6说明:子阵列[2,3]最多6。

  连续阵列的最大产品也是一个经典的动态计划问题,但与普通的动态计划有所不同。

  如果数据是非负数的,则对于连续数组的最大乘积,则处理类似于先前的连续性阵列的最大和处理,或者在前面或自动固定的门户中重叠。

  但是,其中的数据将看起来为负,乘以负数,它可能会从最大值变为最小,而负负数可能成为最大的。

  此时如何考虑?

  简单,我们打开两个DPS,一个DPMAX []记录乘法的最大值,一个DPMIN []记录乘法的最小值。到每次DPMAX和DPMIN都会更新,无论当前值是正值还是正值是正值消极的。这样,可以通过这两个数组记录乘法卷的绝对值。

  动态方程也很容易

  看看一个过程,您可以理解DPMIN在中间起着过多的作用,并记录一些可能的负值以防止准备。结果是DPMAX的值。

  最长的次级序列,也称为LIS,是非常高的动态计划算法之一。相应的应力扣300为您提供了整数阵列数字,并找到了严格严格增加后续序列的长度。

  子序列是从数组中得出的序列,在数组中删除(或未删除)元素,而无需更改其他元素的顺序。例如,[3,6,2,7]是该元素的子序列。阵列[0,3,1,6,2,2,7]。

  输入:nums = [0,1,0,3,2,3]输出:4说明:最长的增量后续序列为[0,1,2,3],因此长度为4。

  对于最长的次级序列,如果您不考虑动态计划的方法,那么对暴力枚举的使用实际上更加麻烦,因为您不知道自己是否必须增加比以前的元素。

  例如,1 10 3 11 4 5,此序列无法选择1 10 11和1 3 4 5是最大的,因此列举所有情况的暴力时间的复杂性仍然很高。

  如果我们采用动态计划方法,则创建的DP []数组,DP [i]表示NUMS [I]末尾的最长增量后续序列,而DP [I]的解决方案是元素和元素和元素和元素和元素元素和前面与最大SON序列相对应,找到一个小于NUMS [I]的元素值和最大增加序列。这段时间的复杂性为O(N2)。

  国家转移方程是:

  具体过程是:

  实施代码是:

  但是,这个问题具有另一种优化,可以对O(nlogn)时间复杂性进行优化。

  我们使用DP记录NUM [I]末端的长期序列的长度。在整个整体情况下,我们希望长度末尾的末端价值尽可能小!

  例如,2,3,9,5 ...前面最长的长度是3我们愿意放弃2,3,9,所有人使用2,3,55。可以在结束的最长序列结束时更新值。

  如果无法更新此值,则不会更新最长的序列,然后尝试更新第二个长度的结束以防止其。例如,2,3,9,5,4,5此序列2,3,5更新2,3,9;然后为2,3,4更新2,3,5,最长的2,3,4,5舱位。

  这个想法的核心是保持一个lenth []数组,长度[i]表示长度i的子序列结束时的最小值,因为我们增加了每个订单的长度以表明此值大于因此,上一个(完全比较)因此,此数组也在增加和增加,因此,当将锁定位置更新为最大长度序列尾值时,您可以使用双点方法来优化。

  实施代码是:

  最长的公共儿童序列也已成为LCS。出现的频率很高!

  给出两个字符串Text1和text2,然后返回这两个字符串的最长公共子序列的长度。如果没有公共子序列,则返回0。

  字符串的子序列是指这样的新字符串:它删除由原始字符串组成的新字符串,以在相对顺序之后删除某些字符而不更改字符。

  例如,“ ACE”是随后的后续“ ABCDE”,但“ AEC”不是随后的后续“ ABCDE”。

  这两个字符串的公开序列是这两个字符串的后续co。

  以b c d e和a c e d e为例。如果使用暴力,复杂性太高而无法超时,则需要使用动态计划。两个字符串匹配,我们设置了两个维度DP [] [] [] [] [] [] array,,dp [i] [j]表示文本1字符串最长的公共子弦端的长度,即文本2字符串j的长度。

  这里的核心是了解状态转移,分析DP [i] [J]的转换,当您到达i,j:如果text1 [i] == text2 [j]时,因为这两个元素都在最后,可以成功匹配。换句话说,在这个位置,邻居的DP值不能比他更大(最多)。目前是DP [i] [j] = dp [i-1] [j-1] +1;

  如果text1 [i]!= text2 [j],有两种可能性。我们认识的邻居是DP [I-1] [J],DP [I] [J-1]。许多人会想到DP [i-1] [J-1]这必须比前两个小,因为它是前两个子!的范围。您必须查看邻居可以匹配的最大值。目前,dp [i] [j] = max(dp [i] [j-1],dp [i-1] [j]))。

  因此,整个状态转移方程是:

  实施代码是:

  给出两个字符串的str1和str2,并输出两个字符串的最长公共子弦。

  例如,Abceef和A2B2CEE3F最长的公共子词是CEE.Public Sub -Skewers是两个字符串中最长和相同的部分。

  如何分析它?与上面最长的公共后续顺序的分析方法类似,有必要匹配动态计划,并且从逻辑上处理更简单。只要i,j不匹配,则DP值为0。如果可以匹配,则它将变为.dp [i-1] [j-1]+ 1核心状态传输方程是:

  这里的代码与上面的代码不同,但是存在一个问题,可以使您输出最长的字符串。您必须记住使用一些变量来存储该值。

  也会出现不同的子序列,并且存在一些困难。您可以查看对上一部分中不同子序列的分析。

  给定一个字符串s和一个字符串t,并计算出现在S的子序列中的t数量。

  字符串的子序列是指通过删除某些(或未删除)字符的剩余字符相对位置的相对位置组成的新字符串。(例如,“ ACE”是“ ABCDE的子序列””,“ AEC”不是)

  例子:

  分析:

  这个问题实际上是上面几个PAT的变形扩展。基本思想实际上是相同的。上面的问题是固定且短的几个PAT。但是,t字符串的长度未固定,因此数组必须用于处理,而不是直接直接进行处理。

  这个问题的想法必须是动态计划DP。dp [j]表示t字符串中t中的长字符数可以匹配s中的长字符数(当然,此值是从后面进行动态的),数组的大小为dp [t.length+1]。将遍历s字符串的元素与t字符串中的所有元素进行比较,以查看它是否等于s字符串的j的j和t字符串的j。= dp [j]。因此,t字符串的每个元素都是t字符串的每个元素。可以正常操作。

  但是要注意的一件事是,当穿过s字符串中的i- then字母时,遍历t字符串不能从左到右从左到右。这一刻需要相对堆叠DP数组(也就是说,同一级别不会产生影响),当从左到右的相同字符会影响差异背后的值的后续值时,您可以参考下图中的示例:

  实施代码是:

  最简单的动态计划仍然是常规的。您会看到一些数组问题和字符串问题。它可能会隐藏动态计划。动态计划的例程与递归有点相似,主要是为了找到状态传输方程。有时,不必过多考虑问题(如果您考虑太多,您可能会加入自己),而动态的计划是在上下改变价值。计算需要了解关系。

  确实很难看到复杂的DP问题或许多外壳,但是掌握上面的常见DP问题和背包问题可以解决大多数动态计划问题(毕竟,我们在比赛中没有遇到过我们的竞争或简单或中等困难。的)。

  作者:Bigsai。