问题1 :你会得到许多长度和宽度均为平板的平板。如果i的两个尺寸都小于j的尺寸,则可以将板坯放在板坯j上。以这种类似的方式,你可以继续将板块放在一起。找到可以用给定的板块创建的最大堆栈。
问题2 :上述问题已提升为3个维度。
问题3 :然后将上述问题提升到k维度。
我相信我们可以将动态编程应用于上述问题。但
“如果i的两个尺寸都小于,我可以将平板放在平板j上 j的那个。
没有明确了解如何根据这两个维度进行排序。
答案 0 :(得分:4)
我不认为动态编程在这个问题上是必要的,这是我的建议:
创建一个顶点集G
的图V
- 代表所有平板,没有边。 (O(|V|)
)
对于i
中的每对平板j
和V
,检查一个平板是否位于另一个平面上(比较任意数量的维度)。说平板i
可以位于平板j
之上,为图形添加边i->j
。如果i
和j
具有相同的尺寸,则应添加单个边。 (O(|V|^2)
)
结果图表为DAG,因为对于任何3个版块i,j,k
,如果i
位于j
之上,j
可以在最高k
,然后k
不能位于i
之上。
为了避免当3个或更多个板块具有相同尺寸(例如i->j, j->k, k->i
)时的循环,如果2个板块具有相同的尺寸,则边缘的方向将从较小的索引到较大的索引(例如,如果i
和j
的尺寸相等,那么我们将添加的边是i->j
)
找到G
中的最长路径。此路径表示具有最大平板数的堆栈。
在DAG中查找此类路径非常简单,可以在linear time(O(|V|+|E|)
)中执行。
此算法的总运行时间为O(|V|)
+ O(|V|^2)
+ O(|V|+|E|)
= O(|V|^2)
。