给出该题的c++完整代码
时间: 2024-11-06 14:11:08 浏览: 3
C++的算法题合集代码.zip
当然,这是一个基于Kadane's Algorithm的C++解决方案,用于计算二维数组的最大子矩阵和:
```cpp
#include <iostream>
#include <vector>
int kadaneMaxSubarraySum(std::vector<std::vector<int>>& matrix) {
int rows = matrix.size();
if (rows == 0) return 0; // 如果矩阵为空,返回0
int cols = matrix[0].size();
int max_current = 0, max_global = INT_MIN;
// 水平扫描(每一列)
for (int i = 0; i < cols; ++i) {
int cur_sum = 0;
for (int j = 0; j < rows; ++j) {
cur_sum += matrix[j][i];
max_current = std::max(cur_sum, max_current);
}
max_global = std::max(max_global, max_current);
}
// 垂直扫描(每一行)
for (int i = 0; i < rows; ++i) {
int cur_sum = 0;
for (int j = 0; j < cols; ++j) {
cur_sum += matrix[i][j];
max_current = std::max(cur_sum, max_current);
}
max_global = std::max(max_global, max_current);
}
// 左上到右下的对角线扫描
for (int i = 0; i < rows && i < cols; ++i) {
int cur_sum = matrix[i][i];
for (int j = i+1; j < rows; ++j) {
cur_sum += matrix[j][i];
max_current = std::max(cur_sum, max_current);
}
max_global = std::max(max_global, max_current);
}
// 右上到左下的对角线扫描
for (int i = 0; i < rows && i < cols; ++i) {
int cur_sum = matrix[i][rows-i-1];
for (int j = i+1; j < cols; ++j) {
cur_sum += matrix[j][rows-j-1];
max_current = std::max(cur_sum, max_current);
}
max_global = std::max(max_global, max_current);
}
return max_global;
}
int main() {
std::vector<std::vector<int>> input = {{0, -2, -7, 0}, {9, 2, -6, 2}, {-4, 1, -4, 1}, {-1, 8, 0, -2}};
int result = kadaneMaxSubarraySum(input);
std::cout << "最大子矩阵和为: " << result << std::endl;
return 0;
}
```
这个代码首先检查矩阵是否为空,然后分别处理水平、垂直以及对角线上的子矩阵,通过`std::max()`函数更新最大和。注意,由于Kadane's Algorithm只能找到非负子数组的最大和,所以这里还需要额外的步骤来考虑对角线情况。
阅读全文