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

从进入到关门的动态计划

时间:2023-03-06 01:26:56 网络应用技术

  现在,如果单击,您可能准备好弄清楚什么是动态计划。一个好孩子,您想知道您是知道黄金还是银色计划?

  抱歉,这篇文章还没有准备好讲话,但是如果您可以使自己有一些新的动态计划经验,那么这扇门就可以关闭。

  每当我听到动态计划一词时,总会有一个抽象和拒绝的想法。我们将不在乎TM的动态计划,房屋在哪里,它在哪里?首先玩游戏,该游戏称为攀登楼梯

  邻居的房子的孩子们总是喜欢爬楼梯。有一天,您以客人的身份去邻居的房子,看到孩子再次爬楼梯。

  此时,姨妈洗了一个水果,向您打招呼,迅速坐着。你拉着姑姑,亲切地看着她,指着孩子,问:如果您的家人有n级楼梯,您可以到达二楼。孩子们必须爬到建筑物顶部的许多不同方式?

  阿姨:...

  您能帮您的姨妈解决这个问题吗?

  分析

  (1)在楼梯中,只有两种儿童选择。下次您爬一两个步骤

  (2)爬到尽头

  (3)不了解所有内容,先画一张图片

  如果姨妈的房子有20个楼梯,爬到20楼,则有一个F(20)方法

  暴力解决方案(1)递归遍历所有情况

  (2)终止条件是完成一个完整的爬行过程,计数为1

  (3)叠加所有情况的次数以获取总数

  在递归过程中,我发现每次递归递归始终是重复的子问题的一部分,而重复儿童问题的计算方法仍然相同。那么这些重复的计算是否需要?您可以在每次记录后保存并使用它吗?一旦确认了该子问题的结果,一旦计算了状态,它就与后续无关状态,可以用作直接数量。

  动态计划

  孙女姨妈,“完成工作后……”,

  几年后,您被邀请作为客人去邻居的家。请注意,您不是王国的姓。这个孩子碰巧再次在家里,跳跃,太可爱了,姨妈热情地看着你,开始陷入回忆。

  您很乐意和孩子一起玩,弹跳,很有趣,问孩子们,总共有5个步骤,并且每个步骤的跳跃数量有限。您最初是在第一个梯子中。有这样的非阴性数组数字,数组中的每个元素代表您可以在此位置跳跃的最大长度。您的目标是使用最小的跳跃来达到数组的最后一个位置。假设您始终可以到达数组的最后位置。您至少会多次跳跃?

  姨妈来到这里:....

  您能帮助孩子解决这个问题吗?

  输入:nums = [2,3,1,1,4]输出:2说明:最小跳跃到最后一个位置是2. 2.从下竞标到0到下价,跳下1步,然后跳3到达阵列的最后位置的步骤。

  我们需要达到第五级的最小步骤,订购F(4)

  暴力解决方案(1)递归地穿越所有可能跳跃情况的位置

  (2)终止条件:跳跃后完成工作

  (3)找到最小次数,因此达到当前步骤的最小次数必须是跳到当前步骤之前的最小次数。F(4)F(4)F(1)和F(3)由两者确定。

  可以优化吗?分析:也有大量重复计算;可以避免重复操作吗?

  动态计划

  孩子们跳了两步,成功地闯入了水平。同时,姨妈还完成了工作并呼气...

  与暴力解决方案相比,动态计划动态数据记录了通过内存数组重复操作的数据状态。

  TM的动态计划是吗?

  是姨妈的功夫还是孩子的智慧,请注意您所姓的国王。

  维基百科弟兄说

  

  

  您的邻居兄弟以这种方式解释:

  这种将解决方案存储到子螺旋桨而不是重新计算的技术被称为。

  动态计划方法是一种解决重叠问题问题的技术,“算法设计和分析基础”。将给定的问题归为儿童问题,并找到解决问题的最佳解决方案,这也是称为“最佳子结构”。避免每次子问题的结果都可以称为内存,这也是动态计划的核心。

  如果将重叠儿童的问题分解为多个子问题,并且所有子问题都需要以相同的方式解决,那么他们属于重叠的子问题。

  如果可以使用子问题的最佳解决方案获得最佳的子结构的最佳解决方案,则给定的问题具有最佳的子结构性质。

  如果给出后效应的一定阶段的状态,那么此阶段之后的过程的发展不会在此阶段之前受国家的影响,即称为后效应,即未来与过去无关。

  这些特征可以保证,可以通过数组形式内存的内存重复使用每个子问题问题的状态结果,并且可以通过子问题的内存结果来计算原始问题。

  然后问题来了,阿姨问,动态计划和分裂之间有什么区别吗?还有贪婪吗?

  是时候表达自己了:

  该分裂方法将问题分为非定义问题,即递归解决方案的问题,然后结合其解决方案以找到原始问题的解决方案。

  让我们首先举一个典型的思想划分的例子

  合并

  合并是递归递归分开的递归,直到无法分裂(仅剩余一个元素),并开始合并从最小的数组中分类。

  相比之下,动态计划应用于子问题的重叠,即不同的子问题具有公共子问题(递归进行了子问题的解决方案,并将其分为较小的子问题)。在这种情况下,该部门算法将执行许多不必要的任务,公共子问题将反复解决,而动态的计划算法只会在每个孩子问题中解决它,并将其保存在一个桌子上,因此,因此每当孩子问题时,无需解决每个解决方案,就需要重新计算以避免这种不必要的计算工作。“简介”

  我们正在解决优化问题,但也存在动态计划的缺点。每个步骤都面临许多选择。可能不需要许多选择。贪婪的算法,每个步骤都是基于解决方案,希望这样的选择能够带来全球最佳。

  例如,孩子们刚才玩的跳跃游戏,我们使用一个数组来记录跳到每个步骤的最小步骤,但实际上我们更关心跳到终点线的最小步骤,因此我们可以记录每个位置每次我们都能能够到每个位置时。

  总而言之,动态计划和治理划分分为大问题。小问题与法规无关。小问题之间存在状态关系。以前的状态是动态计划。

  场景对话

  您:我已经知道动态计划的本质。现在该去打孔并踢幼儿园了。新一代社区霸主即将诞生

  我:不能赢

  你:我赢了

  我:不能赢

  你:我建议你

  那么,动态计划在哪里?我认为在子问题中很难多样化和抽象,

  下面我们将每个儿童问题的计算结果称为状态。原始问题与儿童问题之间的计算关系称为状态与状态之间的关系。

  (1)但是,对于可以记录的状态数组,它由一个维度和n个维度表示。

  (2)对于当前状态中可用的选项,找出直接影响它的状态

  (3)对于动态计划问题,绘画通常可以清晰清晰

  最近,您在社区的楼下开设了一家小商店。今天,姨妈带领孩子买了棒棒糖,9元棒棒糖,姨妈拿出20元,猛烈地盯着你:你的tm棍棒是什么糖金是什么?为我找到最少的钞票。我只需要1,2,5钞票,我不想要其他纸币。

  我:您可以扫描代码吗?

  阿姨:扫描代码?扫描代码,扫描代码。

  完成工作后...

  但是业务仍然必须做。EssenceSessencethen寻找钱

  分析:

  (1)无论发生多少变化,都需要将其分解为具有相应面值的硬币。

  (2)发现零后,该值将降低。只有当更改为0时,除非您是好人,否则您无需找到零

  考虑到众所周知的问题的总体情况,您需要找到零的零,您至少需要使用多少d_1

  暴力求解

  递推关系

  $begin{cases} ?F(n)=minleft{ F(n-d_j) ight}+1& ext{n>0} F(0)=0& ext{n=0} ?end{cases}$

  动态规划

  小区最近来来一个小偷,你们小区只有一个入口,所以只能先从那家偷,但小区治安好,每俩家之间有一个警报器,如果相邻的俩家同时被偷了,那么警报器就会报警,小偷从小数学比较好,勘查地形后,又和邻居家的阿姨闲聊,套出了咱们小区每家每户室内的金币数额,回到家想着我该怎么偷才能在这和小区偷到最大化的价值的东西呢?

  分析

  (1)相邻金币不可同时获得

  (2)要想币值最大化,相邻硬币必定要获得一个

  考虑更一般的问题,给定一排n个硬币,其面值均为正整数,c_1,c_2,..c_n,这些整数并不一定俩俩不同,请问如何选择硬币,是的其在原始位置互不相邻的条件下,所选硬币的总金额最大。为方便形象化理解,这里参考了的解释和图形。

  暴力求解

  递推关系

  $F(n)=max left{ F(n-2)+c_n, F(n-1) ight}$

  $F(0) = 0, F(1) = c_1$

  动态规划

  空间优化版本

  疫情防控期间,你们楼被要求隔离,在家无聊的很,你邀请邻居家的小朋友来家里面玩游戏,这个游戏呢能赚钱,你在n imes m格木板种放有一些硬币,每格的硬币数目最多为一个,小朋友在木板左上方需要收集尽可能多的硬币可能多的硬币并把它们带到右下方的单元格。每一步,小朋友可以从当前的位置向右移动一格或向下移动一格。当小朋友遇到一个有硬币的单元格时,就会将这枚硬币收集起来。设计一个算法找出机器人能找到的最大硬币数。

  暴力求解怎么解?你来想想?

  动态规划怎么做?你来想想?

  递推关系

  $begin{cases} F(i,j)=maxleft{ F(i-1,j),F(i,j-1) ight}+c_{ij}& ext{1<=i<=n,1<=j<=m} F(0,j)=0,1<=j<=m,F(i,0)=0& ext{1<=i<=m} end{cases}$

  给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。

  一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。

  例如,"ace" 是 "abcde" 的子序列,但 "aec" 不是 "abcde" 的子序列。 两个字符串的 公共子序列 是这两个字符串所共同拥有的子序列。

  判断最长公共子序列会出现3种情况

  第一种情况是text1的第一个字符在最长子序列当中;

  第二种情况是text2的第一个字符在最长子序列中;

  第三种情况是都不在。只要取最大值即可。

  暴力求解假设 m

  动态规划

  思考:每次计算新的一行的时候, 用到的都是上一行或者本行之前算过的数据, 所以可以优化到一维数组. 如下图:

  比如计算dp[3][2]的时候, 用到的可能有他的左上角, 正上方, 和左侧数据. 左侧数据是在同一行, 上方数据还未被覆盖,还是上一行的老数据, 所以都可以直接用, 这里唯一注意就是左上方的数据, 因为在计算前一列的时候会被覆盖, 需要在被覆盖之前保存下旧值,因此二维的状态数组可以被优化为一维数组。

  二维DP优化一维DP

  动态规划法建议,与其对交叠的子问题一次又一次地求解,还不如对每个较小的子问题只解一次并把结果记录在表中,这样从表中就可以得出原始问题的解。

  记忆功能技术试图把自顶向下和自底向上的优势结合起来,对具有重叠子问题的问题求解。它用自顶向下的方式,对给定问题的必要子问题只作一次求解,并把结果记录在表中。

  给定n个重量为w_1,w_n,价值为v_1,..v_n的物品和一个承重量为W的背包,求这些物品中最有价值的一个子集,并且要能够装到背包中。

  让我们来考虑一个由前i个物品,物品id有序(1<=i<=n)定义的实例,物品重量为w_1,w_i,价值为v_1,..v_i的物品

  F(i,j)为该实例的最优解的物品的总价值,即,能够放进承重量为j的背包中的前i个物品中最有价值子集的总价值

  (1)根据定义,在不包括第i个物品的子集中,最优子集的价值是F(i-1,j)

  (2)在包括第i个物品的子集中(因此,j-w_i>=0),最优子集是由该物品和前i-1个物品中能够放进承重量为j-w_i的背包的最优子集组成,这种最优子集的总价值等于v_i+F(i-1,j-w_i)

  因此

  $$ F(i,j)=begin{cases}maxleft{ F(i-1,j),F(i-1,j-w_i) ight}, j-w_i>= 0 f(i-1,j),j-w_i<0 end{cases} $$

  当j>当0,f(0,j)= 0

  当i> = 0时,f(i,0)= 0

  我们需要找到f(n,w)

  动态计划涉及问题的解决方案,并符合重叠子问题问题所表达的复发关系。它直接通过算法直接从顶部解决了公共子问题的问题。因此,效率非常低,因此效率非常低。从总体上讲,指数水平甚至更糟。另一方面,经典的动态计划方法在底部起作用:它使用了所有幼儿问题的装饰形式,但是每个子问题的解决方案仅解决一次。

  这种不满意的方法是,在解决给定问题时,通常不需要一些较小的子问题。

  因为这种缺点并未从顶部的向下方法表现出来,所以自然希望将向下和底部的优势结合在一起。

  目标是获得这样的方法。它仅解决必要的子问题,仅解决一次。基于内存功能,此方法存在

  该方法以向下的方式求解为给定的问题,但是它还需要维护类似于自下而上的动态计划的表。在开始时,“零”初始化表用于指示它不用于指示未经记录的未汇编,一旦需要一个新值,请检查是否已首先计算出来,并直接采用NULL的值。否则,将计算递归调用,并将返回结构记录在表中。