我现在使用分而治之算法来找出两个有序元素之间的最大差异(这意味着A [i] [j] - A [k] [l]其中k> i和l> j)在两个维数组,如下所示:
[0,3,6,4]
[9,3,1,6]
[7,8,5,6]
[1,2,3,4]
结果是A [1] [2] - A [0] [0] = 8 - 0 = 8(不是A [0] [1] - A [0] [0] = 9 - 0 = 9。
最大的问题是在一维数组中,如下面的问题:
Divide and Conquer Algo to find maximum difference between two ordered elements
那么如何通过分而治之算法在二维数组中解决它?
非常感谢!
答案 0 :(得分:1)
有一个直接的O(n^2)
解决方案。为了计算A[i][j] − A[k][l]
的最大值,我们暂时修复A[k][l]
。假设下图中的A[k][l] = x
。然后候选集A[i][j]
是阴影矩形。
所以为了使A[i][j] − x
最大化。我们需要知道阴影区域的最大值,这可以通过简单的动态编程来计算。
+------+------+------+-----+
| | | | |
| | | | |
| | | | |
+--------------------------+
| | | | |
| | x | | |
| | | | |
+--------------------------+
| | |------------|
| | |------------|
| | |------------|
+--------------------------|
| | |------------|
| | |------------|
| | |------------|
+------+-------------------+
定义
area(i, j) = { A[x][y] | x > i, y > j }
f(i, j) = max( area(i, j) )
g(m, n) = max { f(i, j) - A[i][j] | 1 <= i <= m, 1 <= j <= n }
然后对于m*n
矩阵,我们想要的是f(m, n)
。
f(i, j) = max { f(i+1, j), f(i, j+1), A[i][j] }
所以2 for循环应该可以完成工作。