时间限制: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年暑期实习生招聘面试二面试题
面积最大的全1子矩阵
从19:42----22:43.。。我也是醉了!
唉。。。
队友代码:
 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 ****************************************************************/
View Code

 

  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 ****************************************************************/
View Code

相关文章: