盒子堆积变异 - 动态规划

时间:2014-03-11 06:01:59

标签: algorithm data-structures dynamic-programming

问题1 :你会得到许多长度和宽度均为平板的平板。如果i的两个尺寸都小于j的尺寸,则可以将板坯放在板坯j上。以这种类似的方式,你可以继续将板块放在一起。找到可以用给定的板块创建的最大堆栈。

问题2 :上述问题已提升为3个维度。

问题3 :然后将上述问题提升到k维度。

我相信我们可以将动态编程应用于上述问题。但

  

“如果i的两个尺寸都小于,我可以将平板放在平板j上   j的那个。

没有明确了解如何根据这两个维度进行排序。

1 个答案:

答案 0 :(得分:4)

我不认为动态编程在这个问题上是必要的,这是我的建议:

  1. 创建一个顶点集G的图V - 代表所有平板,没有边。 (O(|V|)

  2. 对于i中的每对平板jV,检查一个平板是否位于另一个平面上(比较任意数量的维度)。说平板i可以位于平板j之上,为图形添加边i->j。如果ij具有相同的尺寸,则应添加单个边。 (O(|V|^2)

    结果图表为DAG,因为对于任何3个版块i,j,k,如果i位于j之上,j可以在最高k,然后k不能位于i之上。

    为了避免当3个或更多个板块具有相同尺寸(例如i->j, j->k, k->i)时的循环,如果2个板块具有相同的尺寸,则边缘的方向将从较小的索引到较大的索引(例如,如果ij的尺寸相等,那么我们将添加的边是i->j

  3. 找到G中的最长路径。此路径表示具有最大平板数的堆栈。

    在DAG中查找此类路径非常简单,可以在linear timeO(|V|+|E|))中执行。

  4. 此算法的总运行时间为O(|V|) + O(|V|^2) + O(|V|+|E|) = O(|V|^2)