Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 用立方体建造一座塔_Algorithm - Fatal编程技术网

Algorithm 用立方体建造一座塔

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 /

你们可以用立方体制作稳定的塔,不需要把大的放到小的,也不能把重的放到轻的

编写一个程序,从N个立方体中得到最高的塔


输入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};