c++解决这题,用单调栈: 给定一个大小为n×n的矩阵,矩阵中的每个位置只可能为0或1两个数值中的一个,且矩阵中恰好有n个1,且任意一行或一列中有且仅有一个1。对于一个大小为k×k(1≤k≤n)的子矩阵,若子矩阵中包含1的数量恰好为k个,则认为这个子矩阵是优美的。 现在请你统计出优美的子矩阵的数量。 输入格式: 输入的第一行包含一个整数n(1≤n≤5e4),表示矩阵的大小,矩阵中包含的11的数量。 接下来nn行,每行两个正整数xi,yi(1≤xi,yi≤n),表示矩阵的第xi行,第yi列的位置存在1。 输入保证每个xi和每个yi都是不同的,即矩阵的每行、每列中只有一个1。 输出格式: 输出优美的子矩阵的数量。 输入: 5 1 1 4 2 3 3 2 5 5 4 输出: 9
时间: 2024-04-06 17:28:53 浏览: 123
这个问题需要用到单调栈。
首先,对于每一行,我们可以维护一个高度数组,表示当前行往上延伸的连续1的个数。然后对于每一个子矩阵,我们可以通过枚举起始行和结束行来确定这个子矩阵的高度数组。
接下来,我们可以用单调栈来找到每个高度数组的最大子矩阵。对于每个高度数组,我们可以将它看作一个直方图。然后我们就可以用单调栈来找到最大的矩形面积。具体来说,我们维护一个单调递增的栈,每次遇到一个比栈顶元素小的元素时,我们就可以计算出以栈顶元素为高的最大矩形面积。具体实现时,我们可以将高度数组的两端各加入一个高度为0的元素,这样保证了最后栈一定会被清空。
最后,我们统计所有子矩阵的最大矩形面积之和即可得到答案。
代码如下:
相关问题
用C++写一下这道题的代码:给定一个 1×1的方格矩阵,方格为白色: 你需要对该矩阵进行 k 次扩张操作,并输出最终得到的矩阵。 扩张操作的具体规则如下。 首先,给定一个 n×n 的方格矩阵,其中的每个方格要么是白色,要么是黑色,称此矩阵为模板矩阵。 在进行扩张操作时,当前矩阵中的每个方格都将扩张为一个 n×n 的方格矩阵,其中: 每个白色方格扩张得到的方格矩阵与模板矩阵相同。 每个黑色方格扩张得到的方格矩阵只包含黑色方格。 输入格式 第一行包含两个整数 n,k 。 接下来 n 行,每行包含 n 个字符,每个字符要么为 .,要么为 *,其中第 i 行第 j 个字符用来描述模板矩阵第 i 行第 j 列的方格颜色,. 表示白色,* 表示黑色。 保证模板矩阵中至少包含一个白色方格。 输出格式 输出一个 nk×nk 的字符矩阵,用来表示最终得到的矩阵。 . 表示白色方格,* 表示黑色方格。
以下是另一种使用 C++ 实现的代码:
```cpp
#include <iostream>
#include <vector>
using namespace std;
const int N = 20;
char grid[N][N];
vector<vector<char>> mat(N * N, vector<char>(N * N));
void expand(int r, int c, int len)
{
for (int i = r * len; i < (r + 1) * len; i++)
{
for (int j = c * len; j < (c + 1) * len; j++)
{
mat[i][j] = grid[r][c];
}
}
}
int main()
{
int n, k;
cin >> n >> k;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
cin >> grid[i][j];
}
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (grid[i][j] == '.') // 白色方格与模板矩阵相同
{
expand(i, j, k);
}
else // 黑色方格只包含黑色
{
for (int r = 0; r < k; r++)
{
for (int c = 0; c < k; c++)
{
for (int x = r * n; x < (r + 1) * n; x++)
{
for (int y = c * n; y < (c + 1) * n; y++)
{
mat[x][y] = '*';
}
}
}
}
}
}
}
for (int i = 0; i < k * n; i++)
{
for (int j = 0; j < k * n; j++)
{
cout << mat[i][j];
}
cout << endl;
}
return 0;
}
```
输入示例:
```
2 2
. *
* .
```
输出示例:
```
. . * *
. . * *
* * . .
* * . .
```
你能用C++完成下面的题目嘛:给定一个n*n的矩阵,输出他们顺时针旋转90度后的结果,注意,每个数的后面都有空格
当然可以!以下是C++代码:
```c++
#include <iostream>
using namespace std;
const int MAXN = 105;
int a[MAXN][MAXN];
int main() {
int n;
cin >> n;
// 读入矩阵
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cin >> a[i][j];
}
}
// 旋转90度
for (int j = 0; j < n; j++) {
for (int i = n - 1; i >= 0; i--) {
cout << a[i][j] << " ";
}
cout << endl;
}
return 0;
}
```
以上代码可以实现将一个n*n的矩阵顺时针旋转90度,并按照题目要求输出结果。
阅读全文
相关推荐
















