您的位置:首页 > 其它

2016华为上机题三(最大正方形)

2015-09-30 11:18 387 查看
在一个N * M的矩阵中,所有的元素只有0和1, 找出只包含1的最大正方形。
输入为 3 3
1 1 1
1 1 1
0 0 1
这个题与Leetcode中的Maximal Square相同。但是最开始理解错了,以为是求最大矩形这两个题类似。
最大正方形:

#include <iostream>
#include <stdio.h>
#include <cmath>
#include <string>
#include <vector>
#include <algorithm>
#include <memory.h>
#include <stack>

using namespace std;

const double PI = acos(-1.0);
const double eps = 1e-6;
const double INF = 1e9 + 7;

int Min(int a, int b, int c)
{
int m = a;
if (m > b)
m = b;
if (m > c)
m = c;
return m;
}

int main()
{
freopen("data.in", "r", stdin);

int n, m;

cin >> n >> m;

if (n == 0 && m == 0)
{
cout << 0 << endl;
return 0;
}
vector<int> row(m, 0);
vector<vector<int> > matrix(n, row);

for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
cin >> matrix[i][j];
}
}

int** dp = new int*
;
for (int i = 0; i < n; ++i){
dp[i] = new int[m];
memset(dp[i], 0, sizeof(int)*(m));
}

for (int j = 0; j < m; ++j)
if (matrix[0][j] == 1)
dp[0][j] = 1;

for (int i = 0; i < n; ++i)
if (matrix[i][0] == 1)
dp[i][0] = 1;

for (int i = 1; i < n; i++)
{
for (int j = 1; j < m; j++)
{
if (matrix[i][j] == 1)
{
dp[i][j] = Min(dp[i-1][j],dp[i][j-1], dp[i-1][j-1])+1;
}
}
}

int maxArea = dp[0][0];
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
if (maxArea<dp[i][j])
{
maxArea = dp[i][j];
}

}

}

cout <<maxArea << endl;

for (int i = 0; i < m; ++i)
delete[] dp[i];
delete[] dp;

system("pause");
return 0;
}


最大矩形:

#include <iostream>
#include <stdio.h>
#include <cmath>
#include <string>
#include <vector>
#include <algorithm>
#include <memory.h>
#include <stack>

using namespace std;

const double PI = acos(-1.0);
const double eps = 1e-6;
const double INF = 1e9 + 7;

int largestRectangleArea(int* height, int length) {
stack<int> stk;
int i = 0;
int maxArea = 0;
while (i < length){
if (stk.empty() || height[stk.top()] <= height[i]){
stk.push(i++);
}
else {
int t = stk.top();
stk.pop();
int area = height[t] * (stk.empty() ? i : i - stk.top() - 1);
maxArea = maxArea > area ? maxArea : area;
}
}
return maxArea;
}

int main()
{
freopen("data.in", "r", stdin);

int n, m;

cin >> n >> m;

if (n == 0 && m == 0)
{
cout << 0<< endl;
return 0;
}
vector<int> row(m,0);
vector<vector<int> > matrix(n, row);

for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
cin >> matrix[i][j];
}
}

int** dp = new int*
;
for (int i = 0; i < n; ++i){
dp[i] = new int[m + 1];
memset(dp[i], 0, sizeof(int)*(m + 1));
}

for (int j = 0; j < m; ++j)
if (matrix[0][j] == 1)
dp[0][j] = 1;

for (int j = 0; j < m; ++j)
for (int i = 1; i < n; ++i)
if (matrix[i][j] == 1)
dp[i][j] = dp[i - 1][j] + 1;

int maxarea = 0;
for (int i = 0; i < n; ++i){
int tmp = largestRectangleArea(dp[i], m + 1);
if (tmp > maxarea)
maxarea = tmp;
}

cout << maxarea<< endl;

for (int i = 0; i < m; ++i)
delete[] dp[i];
delete[] dp;

system("pause");
return 0;
}


参考:

/article/2749969.html

http://blog.csdn.net/jiyanfeng1/article/details/8068676

http://blog.csdn.net/jiyanfeng1/article/details/47269465
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: