C++单调栈代码 描述给定一个仅包含0 和 1 的二维n*m的矩阵,找出只包含 1 的最大矩阵,并返回其含1的个数
时间: 2024-12-02 18:22:35 浏览: 19
在C++中,要解决这个问题,可以使用单调栈数据结构。这种算法的主要思路是维护一个从左到右、从上到下的路径,对于每一步,如果当前格子是1,就将其压入栈中;如果是0,则检查栈顶元素是否也是0,如果是,说明当前路径无法继续延伸,应该调整为之前的路径;如果不是0,说明我们可以将栈顶的1扩展成一条新的路径。当遍历完整个矩阵后,栈中剩余的就是最大路径中的1的序列。
以下是C++代码实现:
```cpp
#include <iostream>
#include <vector>
#include <stack>
int maxMatrix(int matrix[][], int n, int m) {
std::stack<int> s;
int dp[n][m], maxCount = 0;
// 初始化边界条件
for (int i = 0; i < n; ++i) {
dp[i][0] = matrix[i][0];
if (matrix[i][0]) s.push(i);
}
for (int j = 1; j < m; ++j) {
dp[0][j] = matrix[0][j];
if (dp[0][j]) s.push(0);
}
for (int i = 1; i < n; ++i) {
for (int j = 1; j < m; ++j) {
dp[i][j] = matrix[i][j];
if (!dp[i][j]) continue;
// 如果前一个位置是1,尝试扩展栈顶的1
while (!s.empty() && matrix[s.top()][j - 1] == 0) {
dp[i][j] += dp[s.top()][j - 1];
s.pop();
}
s.push(i); // 更新栈顶
maxCount = std::max(maxCount, dp[i][j]);
}
}
return maxCount;
}
int main() {
int matrix[4][4] = {{1, 0, 1, 1},
{1, 0, 1, 0},
{0, 0, 0, 1},
{1, 1, 1, 1}};
int n = sizeof(matrix) / sizeof(matrix[0]), m = sizeof(matrix[0][0]);
std::cout << "最大含有1的矩阵的元素个数: " << maxMatrix(matrix, n, m);
return 0;
}
```
阅读全文