【发布时间】:2021-11-20 22:10:26
【问题描述】:
我需要实现一个最大和算法,该算法在 2D 矩阵上使用分而治之的策略。我熟悉在 O(n^6) 时间内运行的蛮力方法和在 O(n^3) 中运行的 Kadane 算法,但是如何实施分而治之的方法呢?我整天都在想这件事,什么都没有想到。为了提供上下文,蛮力解决方案是这样的:
void maxSumBruteForce() {
vector<vector<int>> matrix = genRandomMatrix();
int maxSum = INT_MIN;
printMatrix(matrix);
for (int startRow = 0; startRow < matrix.size(); ++startRow) {
for (int startCol = 0; startCol < matrix.size(); ++startCol) {
for (int endRow = startRow; endRow < matrix.size(); ++endRow) {
for (int endCol = startCol; endCol < matrix.size(); ++endCol) {
int curSum = 0;
for (int row = startRow; row <= endRow; ++row) {
for (int col = startCol; col <= endCol; ++col) {
curSum += matrix[row][col];
}
}
if (curSum > maxSum)
maxSum = curSum;
}
}
}
}
cout << "MAX SUM: " << maxSum << endl;
}
Kadane 的算法可以在这里找到:https://www.geeksforgeeks.org/maximum-sum-rectangle-in-a-2d-matrix-dp-27/
我认为解决方案将检查矩阵的四个象限,然后是中间的各种组合。
【问题讨论】:
-
战术说明:Geeks For Geeks 几乎没有内容管理,因此您在从网站获取建议时必须小心。除非您已经知道要寻找的大部分内容,否则您可能无法区分天才的正确工作与 so wrong that they can't comprehend that they are not right 的人的搞笑咆哮之间的区别。我在 Geeks for Geeks 上看到的奇幻作品比玩 D&D 的 40 年还要狂野。
-
我了解您的意思,但我看到多个站点证实了通过 Kadane 算法实现的解决方案。我仍然无法在这个问题上取得任何进展。
-
Kadane 可以重新表述为分而治之:personal.utdallas.edu/~daescu/maxsa.pdf。
-
使用动态编程技术可以非常有效地解决此类问题。
-
@DavidEisenstat 我已经看到这用于最大子数组问题,但我的问题是找到一个最大矩形。我真的不知道该怎么做。我也知道动态编程通常是要走的路,但有人告诉我要实现分而治之的解决方案,而不是动态编程。