Questions tagged «dynamic-programming»

动态编程是一种算法技术,可以有效地解决包含许多重叠子问题的递归结构的问题。

10
什么是动态编程?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 10个月前关闭。 改善这个问题 什么是动态编程? 它与递归,备忘录等有何不同? 我已经阅读了有关维基百科的文章,但我仍然不太了解。



8
自下而上和自上而下有什么区别?
在自下而上方法(用于动态编程)在于首先查看“较小”的子问题,然后使用较小问题的解决方案解决较大的子问题。 在自上而下的在于,如果你已经计算出了解决方案之前,子问题解决一个“自然的方式”,并检查问题。 我有点困惑。两者有什么区别?

9
把猫扔出窗户
想象一下,您在猫的高楼大厦中。猫可以从低矮的窗户掉下来,但如果从高处摔落会死。您如何用最少的尝试次数找出猫可以存活的最长下落? 显然,如果您只有一只猫,则只能进行线性搜索。首先从一楼扔猫。如果它仍然存在,请从第二个开始扔掉。最终,从地板f掉下来的猫会死。然后,您知道f-1楼是最大安全楼。 但是,如果您有不止一只猫怎么办?现在,您可以尝试某种对数搜索。假设该建筑物有100层,而您有两只相同的猫。如果您将第一只猫扔出50层而死,那么您只需线性搜索50层。如果您第一次尝试选择较低的楼层,您甚至可以做得更好。假设您选择一次解决20层楼的问题,而第一个致命楼层是#50。在这种情况下,您的第一只猫将在20和40楼的飞行中幸存下来,然后从60楼死亡。您只需要分别检查41到49楼。总共进行了12次尝试,这比尝试使用二进制消除法所需的50次尝试要好得多。 通常,对于带有2只猫的n层建筑物,什么是最佳策略,哪一种是最坏情况的复杂性?n层和m只猫怎么办? 假设所有猫都是同等的:它们都将存活或死于从给定窗户掉落的猫。同样,每一次尝试都是独立的:如果一只猫摔倒幸存下来,那就完全没有伤害了。 这不是家庭作业,尽管我可能已经解决了一次学校作业。今天,这只是一个异想天开的问题,我不记得了。如果有人知道此问题或解决方案算法的名称,则奖励积分。


5
一个想要了解动态编程的人的简单示例[关闭]
关闭。此问题不符合堆栈溢出准则。它当前不接受答案。 想改善这个问题吗?更新问题,使其成为Stack Overflow 的主题。 5年前关闭。 改善这个问题 我正在为想学习动态编程的人寻找一个易于理解的示例。关于什么是动态编程,这里有很好的答案。斐波那契数列是一个很好的例子,但它太小而无法刮擦表面。尽管我还没有上算法课,但看起来这是一个很棒的主题,希望它会在我春季的清单上。


4
连接所有岛屿的最低费用是多少?
有一个大小为N x M的网格。一些单元格是用“ 0”表示的岛,其他单元格是水。每个水电池上都有一个数字,表示在该水电池上建造一座桥的成本。您必须找到可以连接所有孤岛的最低成本。如果一个单元共享一条边或一个顶点,则该单元将连接到另一个单元。 可以使用什么算法解决此问题?如果N,M的值非常小(例如NxM <= 100),可以用作暴力破解方法? 示例:在给定的图像中,绿色单元格表示岛,蓝色单元格表示水,浅蓝色单元格表示应在其上架桥的单元格。因此,对于以下图像,答案将是17。 最初,我想到将所有岛屿标记为节点,并通过最短的桥梁连接每对岛屿。然后可以将问题简化为最小生成树,但是在这种方法中,我错过了边缘重叠的情况。例如,在下图中,任何两个岛之间的最短距离为7(以黄色标记),因此,通过使用最小生成树,答案将为14,但答案应为11(以浅蓝色标记)。

19
查找两个字符串之间的公共子字符串
我想比较2个字符串并保持匹配,在比较失败的地方分开。 因此,如果我有2个字符串- string1 = apples string2 = appleses answer = apples 另一个示例,因为字符串可能包含多个单词。 string1 = apple pie available string2 = apple pies answer = apple pie 我敢肯定有一种简单的Python方式可以做到这一点,但是我无法解决,感谢您的帮助和解释。

3
如何找到将物品移到堆栈中某个位置的最小移动次数?
给定一组NXP堆栈,其中N为堆栈数,P为堆栈容量,我如何计算从位置A的某个节点移动到任意位置B所需的最小交换数?我正在设计一个游戏,最终目标是对所有堆栈进行排序,以使它们都具有相同的颜色。 # Let "-" represent blank spaces, and assume the stacks are stacks = [ ['R', 'R', 'R', 'R'], ['Y', 'Y', 'Y', 'Y'], ['G', 'G', 'G', 'G'], ['-', '-', '-', 'B'], ['-', 'B', 'B', 'B'] ] 如果我想在插入一个“B” stacks[1][1]这样stacks[1] = ["-", "B", "Y", "Y"]。如何确定所需的最小移动次数? 我一直在研究多种方法,尝试过遗传算法,可以从状态生成所有可能的移动,对它们进行评分,然后继续沿最佳得分路径前进,我还尝试运行Djikstra的算法来对问题进行寻路。看起来很简单,但是我无法找到一种方法来让它在指数时间以外的任何时间运行。我是否缺少适用于此的算法? 编辑 我已经编写了此函数来计算所需的最小移动量:堆栈:表示堆栈中棋子的字符列表,堆栈[0] [0]是堆栈[0]的顶部stack_ind:将要添加到堆栈中的片断的堆栈stacks.exe def calculate_min_moves(stacks, stack_ind, …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.