时间限制:1 秒
内存限制:128 兆
特殊判题:否
提交:859
解决:179
- 题目描述:
-
在一个M * N的矩阵中,所有的元素只有0和1,从这个矩阵中找出一个面积最大的全1子矩阵,所谓最大是指元素1的个数最多。
- 输入:
-
输入可能包含多个测试样例。
对于每个测试案例,输入的第一行是两个整数m、n(1<=m、n<=1000):代表将要输入的矩阵的大小。
矩阵共有m行,每行有n个整数,分别是0或1,相邻两数之间严格用一个空格隔开。
- 输出:
-
对应每个测试案例,输出矩阵中面积最大的全1子矩阵的元素个数。
- 样例输入:
-
2 2 0 0 0 0 4 4 0 0 0 0 0 1 1 0 0 1 1 0 0 0 0 0
- 样例输出:
-
0 4
- 来源:
- 腾讯2012年暑期实习生招聘面试二面试题
- 从19:42----22:43.。。我也是醉了!
- 唉。。。
- 队友代码:
-
View Code
1 #include<stdio.h> 2 3 int dp[1005][1005],a[1005][1005]; 4 5 int main() 6 { 7 int n,m; 8 for(int i=0;i<=1000;i++) 9 dp[0][i]=dp[i][0]=0; 10 while(scanf("%d%d",&n,&m)>0) 11 { 12 for(int i=1;i<=n;i++) 13 for(int j=1;j<=m;j++) 14 scanf("%d",&a[i][j]); 15 int sum=0; 16 for(int i=1;i<=m;i++) 17 { 18 sum+=a[1][i]; dp[1][i]=sum; 19 } 20 for(int i=2;i<=n;i++) 21 { 22 sum=0; 23 for(int j=1;j<=m;j++) 24 { 25 sum+=a[i][j]; dp[i][j]=dp[i-1][j]+sum; 26 } 27 } 28 int maxk=0; 29 for(int i=n;i>0;i--) 30 for(int j=m;j>0&&maxk<i*j;j--) 31 if(a[i][j]) 32 { 33 int r=1,c=1; 34 while(j-c>=0) 35 { 36 if(dp[i][j]-dp[i][j-c]-dp[i-r][j]+dp[i-r][j-c]==r*c) 37 { 38 if(maxk<r*c) maxk=r*c; c++; 39 } 40 else 41 break; 42 } 43 while(i-r>=0&&c>0) 44 { 45 if(dp[i][j]-dp[i][j-c]-dp[i-r][j]+dp[i-r][j-c]==r*c) 46 { 47 if(maxk<r*c) maxk=r*c; r++; 48 } 49 else 50 c--; 51 } 52 } 53 printf("%d\n",maxk); 54 } 55 } 56 57 /************************************************************** 58 Problem: 1497 59 User: aking2015 60 Language: C++ 61 Result: Accepted 62 Time:410 ms 63 Memory:8912 kb 64 ****************************************************************/
1 #include <stdio.h> 2 #include <string.h> 3 #include <algorithm> 4 using namespace std; 5 6 int map[1005][1005]; 7 int col[1005][1005]; 8 int n,m,maxn; 9 10 void set_col(int p) 11 { 12 int i,j,sum; 13 for(i = 1; i<=n; i++) 14 { 15 if(!map[i][p]) 16 continue; 17 j = i; 18 sum = 0; 19 while(map[j][p] && j<=n) 20 { 21 sum+=map[j][p]; 22 j++; 23 } 24 for(int k = i; k<j; k++) 25 col[k][p] = sum; 26 i = j; 27 } 28 } 29 30 int find(int r,int c) 31 { 32 int i,j,val=map[r][c]; 33 int cnt = 1; 34 for(i = r-1; i>0; i--) 35 { 36 if(val>map[i][c]) 37 break; 38 cnt++; 39 } 40 for(i = r+1; i<=n; i++) 41 { 42 if(val>map[i][c]) 43 break; 44 cnt++; 45 } 46 return val*cnt; 47 } 48 49 int solve() 50 { 51 int i,j; 52 maxn = 0; 53 for(i = 1; i<=n; i++) 54 { 55 for(j = 1; j<=m; j++) 56 { 57 if(maxn<col[i][j] && map[i][j]) 58 { 59 int val = find(i,j); 60 maxn = max(maxn,val); 61 } 62 } 63 } 64 return maxn; 65 } 66 67 int main() 68 { 69 int i,j; 70 while(~scanf("%d%d",&n,&m)) 71 { 72 for(i = 1; i<=n; i++) 73 { 74 for(j = 1; j<=m; j++) 75 scanf("%d",&map[i][j]); 76 } 77 for(i = 1; i<=n; i++) 78 { 79 for(j = 2; j<=m; j++) 80 { 81 if(map[i][j]==1 && map[i][j-1]) 82 map[i][j]=map[i][j-1]+1; 83 } 84 } 85 for(i = 1; i<=m; i++) 86 set_col(i); 87 printf("%d\n",solve()); 88 } 89 90 return 0; 91 } 92 93 /************************************************************** 94 Problem: 1497 95 User: aking2015 96 Language: C++ 97 Result: Accepted 98 Time:440 ms 99 Memory:8912 kb 100 ****************************************************************/