🎁 长周末专享特惠!VIP通行证6个月立减$50,蓝莓立减$25 🎁
查看: 2768| 回复: 10
收起左侧

Google: 最大无障碍点子矩阵

wwwyhx | 显示全部楼层
本楼:   👍  0
0%
0%
0   👎
全局:   177
88%
12%
25

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
a) There is a square of nxn size which is comprised of n-square 1x1 squares.
Some of these 1x1 squares are colored. Find the biggest sub square which is not colored.
b) Also asked to extend it to find the biggest area rectangle.

这题有难度

上一篇:Hanoi problem
下一篇:关于extern的问题 c++
Narashy 2011-7-5 02:13:35 | 显示全部楼层
本楼:   👍  0
0%
0%
0   👎
全局:   24
96%
4%
1
最大0-1子矩阵啊,可以做到O(n^2).
记录下每个点当前向上最大高度h[i,j],以及保持该高度下,向左left[i][j],向右right[i][j],可以延伸多远,
答案就是max_{i,j} h[i][j]*(right[i][j] - left[i[j]+1).


怕麻烦的话用最大子矩阵的算法,O(n^3)
回复

使用道具 举报

 楼主| wwwyhx 2011-7-5 23:57:02 | 显示全部楼层
本楼:   👍  0
0%
0%
0   👎
全局:   177
88%
12%
25
最大0-1子矩阵啊,可以做到O(n^2).
记录下每个点当前向上最大高度h,以及保持该高度下,向左left[j],向右right[j],可以延伸多远,
答案就是max_{i,j} h[j]*(right[j] - left+1).


怕麻烦的话用最大子矩阵的算法,O(n^3)
Narashy 发表于 2011-7-5 02:13


有O(N)的解法,动态规划。
方程就是: F(i,j) = 0 : 1+min(F(i-1,j), F(i,j-1), F(i-1,j-1))
F(i,j)代表以M[i][j]为top right顶点的最大满足要求的square.
方程得到的方式可以这么想,以F(i,j)为出发点,每次向横坐标减一,纵坐标减一这样扩展。
最大矩阵的话也是类似的思路。
回复

使用道具 举报

 楼主| wwwyhx 2011-7-5 23:57:32 | 显示全部楼层
本楼:   👍  0
0%
0%
0   👎
全局:   177
88%
12%
25
代码:

  1. void GetMaxSquare(int M[N][N])
  2. {
  3.         int REC[N][N];
  4.         int nMaxLen = -1;
  5.         int x = 0;
  6.         int y = 0;

  7.         for (int i = 0; i < N; i++)
  8.         {
  9.                 if ((REC[i][0] = M[i][0]) > nMaxLen)
  10.                 {
  11.                         x = i;
  12.                         y = 0;
  13.                         nMaxLen = REC[i][0];
  14.                 }

  15.                 if ((REC[0][i] = M[0][i]) > nMaxLen)
  16.                 {
  17.                         x = 0;
  18.                         y = i;
  19.                         nMaxLen = REC[0][i];
  20.                 }
  21.         }

  22.         for (int i = 1; i < N; i++)
  23.                 for (int j = 1; j < N; j++)
  24.                 {
  25.                         if (0 == M[i][j])
  26.                         {
  27.                                 REC[i][j] = 0;
  28.                                 continue;
  29.                         }

  30.                         int nMin = REC[i-1][j] < REC[i][j-1] ? REC[i-1][j] : REC[i][j-1];
  31.                         nMin = nMin < REC[i-1][j-1] ? nMin : REC[i-1][j-1];
  32.                         REC[i][j] = nMin + 1;

  33.                         if (nMaxLen < REC[i][j])
  34.                         {
  35.                                 x = i;
  36.                                 y = j;
  37.                                 nMaxLen = REC[i][j];
  38.                         }
  39.                 }

  40.         cout<<x-nMaxLen+1<<" "<<y-nMaxLen+1<<" "<<x<<" "<<y<<endl;
  41. }
复制代码
回复

使用道具 举报

Narashy 2011-7-6 00:21:20 | 显示全部楼层
本楼:   👍  0
0%
0%
0   👎
全局:   24
96%
4%
1
本帖最后由 wwwyhx 于 2011-7-6 00:31 编辑

回复 4# wwwyhx


   你这个是O(n^2)的算法啊(你说的N是矩阵地边长而不是面积吧)。是解square的情形的。rectangle貌似解不了。

当然,看这个n代表的是什么了,如果是矩阵长度,那就是O(n^2),再快也要先遍历一遍吧,哈哈。

换种想法就可以解rectangle 了,用两个matrix[n,n]来做DP,一个记录长,一个记录宽,主要思想还是类似的,就是从i,j纵向扩展的限制,i,j开始横向扩展的限制规律推导方程,太麻烦懒得做了
回复

使用道具 举报

 楼主| wwwyhx 2011-7-6 00:32:10 | 显示全部楼层
本楼:   👍  0
0%
0%
0   👎
全局:   177
88%
12%
25
回复  wwwyhx


   你这个是O(n^2)的算法啊(你说的N是矩阵地边长而不是面积吧)。是解square的情形的。rectangle貌似解不了。

当然,看这个n代表的是什么了,如果是矩阵长度,那就是O(n^2),再快也要先遍历一遍吧,哈哈。

换种想法就可以解rectangle 了,用两个matrix[n,n]来做DP,一个记录长,一个记录宽,主要思想还是类似的,就是从i,j纵向扩展的限制,i,j开始横向扩展的限制规律推导方程,太麻烦懒得做了
Narashy 发表于 2011-7-6 00:21


不好意思,引用点成编辑了。觉得这题好难,我是看别人的解法的
回复

使用道具 举报

 楼主| wwwyhx 2011-7-6 00:36:25 | 显示全部楼层
本楼:   👍  0
0%
0%
0   👎
全局:   177
88%
12%
25
最大0-1子矩阵啊,可以做到O(n^2).
记录下每个点当前向上最大高度h,以及保持该高度下,向左left[j],向右right[j],可以延伸多远,
答案就是max_{i,j} h[j]*(right[j] - left+1).


怕麻烦的话用最大子矩阵的算法,O(n^3)
Narashy 发表于 2011-7-5 02:13


你这个思路如何保证O(n^2)??
计算“延伸多远”可以做到O(1)吗
回复

使用道具 举报

Narashy 2011-7-6 00:48:50 | 显示全部楼层
本楼:   👍  0
0%
0%
0   👎
全局:   24
96%
4%
1
回复 7# wwwyhx

我觉得你那个用亮哥矩阵分别记录长宽地方法不太可行。。

left[i][j] = left[i][j-1]      if h[i][j-1] >= h[i][j]    else j
  right[i][j] = right[i][j+1]  if h[i][j+1] >= h[i][j]  else j
回复

使用道具 举报

 楼主| wwwyhx 2011-7-6 00:53:05 | 显示全部楼层
本楼:   👍  0
0%
0%
0   👎
全局:   177
88%
12%
25
回复  wwwyhx

我觉得你那个用亮哥矩阵分别记录长宽地方法不太可行。。

left[j] = left[j-1]      if h[j-1] >= h[j]    else j
  right[j] = right[j+1]  if h[j+1] >= h[j]  else j
Narashy 发表于 2011-7-6 00:48

和方形是一个原理吧,就是f(i,j)记录坐标(i,j)上的最优解,
i,j向两边扩展会受到f(i-1,j),f(i-1,j-1),f(i,j-1)的限制得出状态转移方程。
区别是方形必须两边同时扩展,矩阵不需要遵守
回复

使用道具 举报

Narashy 2011-7-6 04:22:16 | 显示全部楼层
本楼:   👍  0
0%
0%
0   👎
全局:   24
96%
4%
1
本帖最后由 Narashy 于 2011-7-6 04:36 编辑

回复 9# wwwyhx


  恩!这题可以用这个一模一样的题测一下:
http://poj.org/problem?id=3494
附上我的code:
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <algorithm>
  4. #include <cstring>

  5. using namespace std;

  6. const int N = 2010;

  7. int m, n;
  8. int h[N][N], lt[N], rt[N];

  9. int main()
  10. {
  11.         int i, j, k, ans;

  12.         while(scanf("%d%d",&m,&n)==2)
  13.         {
  14.                 memset(h, 0, sizeof(h));
  15.                 ans = 0;
  16.                
  17.                 for(i=1;i<=m;i++){
  18.                         for(j=1;j<=n;j++){
  19.                                 scanf("%d",&k);
  20.                                 h[i][j] = k? 1+h[i-1][j]: 0;
  21.                                 lt[j] = rt[j] = j;
  22.                         }
  23.                         h[i][0] = h[i][n+1] = -1;
  24.                         for(j=1;j<=n;j++)
  25.                         {
  26.                                 while(h[i][j]<=h[i][lt[j]-1]) lt[j]=lt[lt[j]-1];
  27.                                 while(h[i][n-j+1]<=h[i][rt[n-j+1]+1]) rt[n-j+1]=rt[rt[n-j+1]+1];
  28.                         }

  29.                         for(j=1;j<=n;j++)
  30.                                 ans = max(ans, h[i][j]*(rt[j]- lt[j]+1));
  31.                 }
  32.                 printf("%d\n",ans);
  33.         }
  34.         return 0;
  35. }
  36.                                                   

  37.                
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表