首先是1D案例。给定N个数组的数组,将其切割成n个块,以使每个元素与其块平均值的平方距离之和最小化。例如,如果要求将[0.1,0.3,2,1.2,1.3]切成三块,最佳解是[[0.1,0.3],[2],[1.2,1.3]]。
通过动态编程,可以在O(N * n)
中轻松解决这个问题现在是2D案例。我们给了一个(N,M)矩阵,我们希望用n * m块来剪切它。解决方案应该看起来像一个不规则间隔的网格 - 它是一组n个水平切割和m个垂直切割。
这看起来更棘手。人们可以通过固定水平切口动态地找到最佳垂直切口,但这似乎不会导致任何地方。枚举所有可能的水平切割O(C(M,m))是难以处理的。
有没有办法在多项式时间内做到这一点?