DLUTOJ 1033 Matrix
Description
We often use the matrix to analyze reality models. There are lots of algorithm about matrix in Linear Algebra like matrix multiplication, matrix determinant and matrix inversion, etc.
Recently, I should use matrix to do structural mechanics analysis. The element in the matrix indicating the mechanical properties of each unit in the structure. Stable sub-structure means a part with same mechanical properties. I want to find the largest stable sub-struture as it has good engineering applications. Reflected in the matrix, the problem above equals to find the largest sub-matrix whose members have the same value.
To accomplish the task perfectly, I wish you can help me to design a good algorithm to solve this problem.
Input
There are multiple test cases.
The first line contains two integers N and M, indicating the size of this N * M matrix A.
The next N line, each line containing M integers. The j-th integer in the i-th line means the element A(i, j).
1 <= N, M <= 800
1 <= A(i, j) <= 1000
Output
For each test, output the size of the largest sub-matrix satisfied the requests.
Sample Input
3 3 1 1 1 1 2 1 1 1 1 2 2 1 2 3 4 4 4 1 1 1 2 1 3 3 2 5 3 3 2 6 6 6 7Sample Output
3 1 4HINT
Source
Solution
单调栈
Implementation
#include <cstdio> #include <stack> using namespace std; typedef long long LL; const int N(800+5); int h , L , R , a ; stack<int> st; //[L[i], R[i]) int mono_stack(int l, int r){ for(; st.size(); st.pop()); for(int i=l; i<r; i++){ for(; !st.empty()&&h[st.top()]>=h[i]; st.pop()); if(st.empty()) L[i]=l; else L[i]=st.top()+1; st.push(i); } for(; st.size(); st.pop()); for(int i=r-1; i>=l; i--){ for(; !st.empty() && h[st.top()]>=h[i]; st.pop()); if(st.empty()) R[i]=r; else R[i]=st.top(); st.push(i); } int res=0; for(int i=l; i<r; i++) res=max(res, h[i]*(R[i]-L[i])); return res; } void solve(int n, int m){ int res=0; for(int i=0; i<n; i++){ if(i==0) for(int j=0; j<m; j++) h[j]=1; else for(int j=0; j<m; j++) if(a[i][j]==a[i-1][j]) h[j]++; else h[j]=1; //two-pointers for(int l=0, r; l<m; l=r){ for(r=l+1; r<m && a[i][r]==a[i][l]; r++); res=max(res, mono_stack(l, r)); } } printf("%d\n", res); } int main(){ for(int n, m; ~scanf("%d%d", &n, &m); ){ for(int i=0; i<n; i++) for(int j=0; j<m; j++) scanf("%d", a[i]+j); solve(n, m); } return 0; }
- Eclipse使用入门教程
- 指向函数的指针—应用场景
- 大部分作业都写完了
- 使用Git第一篇
- GenericServlet和HttpServvlet区别和联系
- 使用Maven搭建Spring+SpringMVC+Mybatis+ehcache项目
- iframe高度自适应
- 分享:JavaScript常见面试题
- CCNP学习笔记12-交换部分---vlan
- 三个tableView联动
- 闭包闭包!!!
- Java常见面试题
- Naive Pattern Searching
- 设计模式:接口隔离原则
- 思杰 Citrix xendesktop 7.6 企业级布署 Citrix License server 安装
- 思杰 Citrix xendesktop 7.6 企业级布署 Citrix License server 安装
- RMQ问题 (st+线段树)
- Android自学笔记-5-click事件的四种写法
- Hive Shell命令之一(数据库和表的操作)
- GDB+GdbServer: ARM程序调试