Algorithm 用立方体建造一座塔
你们可以用立方体制作稳定的塔,不需要把大的放到小的,也不能把重的放到轻的 编写一个程序,从N个立方体中得到最高的塔Algorithm 用立方体建造一座塔,algorithm,Algorithm,你们可以用立方体制作稳定的塔,不需要把大的放到小的,也不能把重的放到轻的 编写一个程序,从N个立方体中得到最高的塔 输入txt的第一行包含多维数据集的数量。(1有不同的方法来解决这个问题。下面是一种在伪代码中效率相当低的简单方法: // `Input` is a list of `Cube` who have a `Size` and `Weight` property int largestStack(input_cubes_left, currentCube) { max = 0 /
输入txt的第一行包含多维数据集的数量。(1有不同的方法来解决这个问题。下面是一种在伪代码中效率相当低的简单方法:
// `Input` is a list of `Cube` who have a `Size` and `Weight` property
int largestStack(input_cubes_left, currentCube)
{
max = 0 // at worst, there are no cubes that fit on top of currentCube
foreach (cube in input_cubes_left)
{
// skip all cubes which don't fit
if (cube.Size <= current.Size and cube.Weight <= current.Weight)
{
// measure the stack with currentCube, this cube, and whatever is left
size = 1 + largestStack(input_cubes_without_cube, cube)
// but of course we only count the ones
// which are bigger than our best result
if size>max
max = size
}
}
return max;
}
/`Input`是具有'Size'和'Weight'属性的'Cube'的列表
int largestStack(输入多维数据集左,currentCube)
{
max=0//最坏情况下,没有适合currentCube顶部的多维数据集
foreach(输入中的多维数据集\u cubes\u left)
{
//跳过所有不适合的立方体
if(cube.Size)算法
我提出的算法是通过使用有序对列表来工作的。这些对首先按一个元素排序,然后按第二个元素排序
我们维护配对列表,其中每对新配对为:
- 添加到最高列表的末尾(如果可以放在最后一个元素之后)
- 添加到新列表的末尾,该列表是现有列表中最高段的副本,可以将其追加到该列表中
- 如果现有列表中的任何位置都无法容纳,则添加到新列表中
证明
第一个元素将进入一个新的列表,该列表将是最高的
n-th元素将转到最高列表(或列表段)的末尾,使其成为具有该元素的最高列表
n之后的第一个元素,即元素k,可以附加到列表中的n将附加到包含n的最高列表中,原因是2。如果某个更高的列表中存在元素i,元素k可以附加到该列表中,则规则2为a应用于元素i。这使得具有k的列表成为该元素的最高列表
通过归纳,证明了算法的概念
伪码
foreach有序对
maximumIndex首先,假设没有相等的立方体(长度/重量相同的立方体),根据以下定义构建一个有向图:
图中每个立方体正好有一个节点
如果立方体B可以放在立方体A上,则添加边(A->B)
很容易知道这是一个DAG()
原问题相当于在DAG中寻找最长路径,我们可以用动态规划来解决这个问题
回到假设,甚至考虑相等的立方体,我们可以做轻微的改变来覆盖相等的立方体。(每个节点都具有属性均等数,相等的立方体的数目,并且沿着路径的等值和的总和更新最长路径定义,以代替原来的定义:沿着路径的节点的数目)
问题很好!我没有想到按权重排序,但一旦你这样做了(而且,我想,一旦你也按大小对相同权重的盒子进行了排序),你就要解决一个“最长非严格递减子序列问题”在高度上。看看这个问题,看看你是否可以将它调整为非严格的和递减的。谢谢,我要看看它。那么问题是什么?找到最高的塔,或者像你在Sklivz下的评论中所说的那样将其写入文件♦ 回答?找到最高的塔,如果我是incomprehensible@Rawling这并不等同于最长非严格递减子序列问题。例如,想象一下,如果示例输入有一个长度为100、重量为1的立方体,那么该立方体将为您提供最高的塔。继续是不必要的(已修改)您可以相对轻松地保留所有堆栈,而不是最大值,并且只返回最长的堆栈。但这样做可能效率极低:-)天哪,您是个天才。非常感谢,但没有人会相信我写了这篇文章,因此我将以某种方式(在您ofc的帮助下)编写自己的:D.否则,我在您的中发现了一个小错误,如果我再添加一个立方体(100,1),它将给出相同的结果:(20,5)(10,3)(10,2),但是(100,1)仍然更大,即使它是一个立方体。抱歉,我刚刚意识到“长度”实际上是指高度。幸运的是,这只是find方法中的一个小更新(它增加了高度,而不是增加了立方体的数量。我之前的假设是,你需要找到拥有最多立方体的塔。我会更新它。嘿,我认为你不应该道歉。再次感谢:)我非常感谢你的工作。这是煎饼式的。
// `Input` is a list of `Cube` who have a `Size` and `Weight` property
int largestStack(input_cubes_left, currentCube)
{
max = 0 // at worst, there are no cubes that fit on top of currentCube
foreach (cube in input_cubes_left)
{
// skip all cubes which don't fit
if (cube.Size <= current.Size and cube.Weight <= current.Weight)
{
// measure the stack with currentCube, this cube, and whatever is left
size = 1 + largestStack(input_cubes_without_cube, cube)
// but of course we only count the ones
// which are bigger than our best result
if size>max
max = size
}
}
return max;
}
foreach ordered pair
maximumIndex <- 0
maximumList <- null
foreach list
highest, length <- FindLongestPath(list, pair)
if highest > maximumHeight
maximumHeight<- highest
maximumIndex <- lenght
maximumList <- list
if maximumIndex = 0
lists.add(new list{pair});
else if maximumIndex < maximumList.Length
lists.add(new list{maximumList[0..maximumIndex - 1] + pair});
else
list.add{pair};