![]() |
1
9
我认为这是一个经典的素材 dynamic programming 解决方案。事实上,看看“序列比对”,这可能是维基百科页面上的另一个很好的搜索词。 关键的见解是: 想象一下,你的钉子是一个钉子位置列表(钉子1:更多钉子),插槽是一个插槽位置列表(插槽1:更多插槽)。称此问题为(peg1:挂钩,slot1:插槽)。那么,解决方案要么是插槽1中的peg1;(pegs,slots)的解决方案,或者它就是(peg1:pegs,slots)的解。 这给出了如何解决它的递归定义。 或者在伪代码中(以函数式编程风格编写),想象一个函数距离(peg、slot):
通过将距离组合到数据结构中,应该使该解决方案更有效。 |
![]() |
2
2
我不知道这个问题从哪里来,但我很确定这是一种 combinatorial optimization ,更具体地说,可以使用 (integer) linear programming . |
![]() |
3
1
除非我遗漏了什么,否则这不是问题。 由于必须保持木桩的顺序,您可以将木桩编号为1、2、3、。..
最终状态必须是槽1中的栓钉1、槽2中的栓钉2等。
不能让钉子跳过彼此并不重要,每个钉子都必须从起点移动到终点一定距离。 只要所有动作都朝着正确的方向,挂钩永远不必后退 ,那么每个单独的钉子必须移动的距离是一个简单的常数(它不取决于移动的顺序),这些距离的总和,你的成本函数也是常数。 我认为这里不需要动态规划或线性规划优化问题。 如果你引入了一个拾取钉子并将其放下的成本,那么这里可能存在一个优化问题,但即使是这样也可能是微不足道的。 编辑 针对1800 Information的评论
好吧,我错过了。谢谢你指出我错过了什么。不过,我仍然不相信这是火箭科学。 假设#pegs>#洞。如上所述计算最终状态,就像你有额外的孔一样;然后选择移动得最远的N个钉子,并将其从问题中删除:这些钉子没有移动。重新计算忽略这些挂钩。 假设#holes>#钉子。正确的最终状态可能有也可能没有间隙。如上所述计算最终状态,并寻找相邻桩相互靠近的位置。这些是你可以将其分解为可以轻松解决的子问题的地方。当你在连续子问题的两端都有洞时,还有一个额外的变量——最终连续序列从哪里开始。 是的,这比我一开始想象的要复杂一些,但似乎一点铅笔和纸的工作应该表明,解决方案是几个易于理解和编码的循环。 |
![]() |
4
0
组合学。组合算法。具体数学。(标题也 an excellent and relevant book Donald Knuth。 |
![]() |
5
0
如果桩数==槽数,则只存在一个解。 第一个挂钩必须转到第一个槽,下一个挂钩必须到下一个槽,以此类推。 数字不同,那么它就稍微复杂一些,因为一个钉子或插槽(无论我们可以移动哪个)可以移动到许多地方。 蛮力: 假设对象的数量是m个桩和n个槽(可互换);n
递归解决方案:
此解决方案仍然需要将结果存储在表中,这样就不会多次解决任何子问题,从而成为动态解决方案。 思考。…将更新。.... |
![]() |
6
-1
排队论或数学。.. |
![]() |
feasega · 聚合物模拟-2个节点之间的最短路线,适用于所有节点 9 月前 |
![]() |
Alisa Petrova · 在有向图中更改一对顶点以创建循环 9 月前 |
![]() |
Pengcheng · 这个简单的递归函数的输出是什么?你能详细解释一下吗? 10 月前 |
![]() |
b39b332d · 使用C++标准库实现高效间隔存储 1 年前 |
![]() |
ABGR · 二叉树的直径——当最长路径不通过根时的失败案例 1 年前 |
![]() |
EpicAshman · 数独棋盘程序中同一列和同一行出现两次的数字 1 年前 |