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相同。但是最开始理解错了,以为是求最大矩形这两个题类似。
最大正方形:
最大矩形:
参考:
/article/2749969.html;
http://blog.csdn.net/jiyanfeng1/article/details/8068676;
http://blog.csdn.net/jiyanfeng1/article/details/47269465;
输入为 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;
相关文章推荐
- [转]Eclipse 的快捷键以及文档注释、多行注释的快捷键
- 成本控制系统的原则
- Arrays.binarySearch(int[] a, int key)
- 数据库设计三大范式
- MFC里ON_COMMAND_RANGE消息映射的ID问题
- 当代世界经济的发展趋势
- Java高级特性 内省
- 黑客常用公积方法
- tar压缩解压
- TCP/IP详解卷1 读书笔记:第三章 IP网际协议
- 二值图像区域边界问题
- 进销存软件开发视频教程(C#版,共70讲)
- OutputStreamWriter和BufferedWriter疑惑
- 关于入世后我们应该怎么办的电视访谈
- HDU 4777 Rabbit Kingdom
- 电信系统数据集市元数据管理方案
- 记忆碎片 - 中秋
- 记忆碎片 - 中秋
- smarty中,如果改变模板,刷新页面没有变化,该如何解决?
- 架构之路(四):测试驱动