打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
寻找最大的矩形
#include "stdafx.h"
#include <stdio.h>
#include <memory.h>
#define  MAX_LEN 2005

//http://blog.csdn.net/hopeztm/article/details/7870387
//4*6 
// 0 1 0 1 0 0 
// 0 1 1 0 0 1
// 1 1 1 0 1 0
// 0 0 0 0 0 1

int nRow,nCol;

int matrix[MAX_LEN][MAX_LEN]; // 原始数据
int heights[MAX_LEN][MAX_LEN]; //用这个数据来描述histogram,其中heights[i]表示以第i行走底的histogram,里面的元素表示对应的列的高度

struct Node
{
int height;
int position;

Node(int _height,int _from):height(_height),position(_from)
{
}
Node()
{
}
};

int max(int a,int b)
{
return a > b?a:b;
}


int topID;
Node stack[MAX_LEN];

//栈对应的操作
void push(const Node & t)
{
stack[topID++] = t;
}

const Node top()
{
return stack[topID-1];
}

void pop()
{
topID--;
}

int GetArea(int iRow) // 用单调的栈来枚举其中以第一行做底的histogram所得到的最大的矩形面积
{
topID=0;
push(Node(-1,0));
int i;
int area,maxArea=0;
int position,height;
for(i = 0;i<=nCol;i++)
{
position = i + 1;
if(i == nCol)
{
height = -1;
}
else
{
height = heights[iRow][i];
}
Node t(height,position);
while(top().height > height)
{
t=top();
pop();
area=(position-t.position)*t.height;
if(area > maxArea)
{
maxArea=area;
}
}
push(Node(height,t.position));
}
return maxArea;
}

/*
int main(int argc, char *argv[])
{
  while(scanf("%d%d",&nRow,&nCol) != EOF)
  {
  int i,j;
  int b;
  for(i=0;i<nRow;i++)
  {
  for(j=0;j<nCol;j++)
  {
  scanf("%d",&matrix[i][j]);
  }
  }

  memcpy(heights,matrix,sizeof(matrix));
  for(i = 0;i < nCol;i++)
  {
  for(j=1;j<nRow;j++)
  {
  if(heights[j][i] !=0)
  {
  heights[j][i]+=heights[j-1][i];
  }
  }
  }

  int maxArea = 0,Area;
  for(i=0;i<nRow;i++)
  {
  Area = GetArea(i);
  maxArea=max(maxArea,Area);
  }
  printf("maxArea:%d\n",maxArea);
  }
  return 0;
}

*/
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
[LeetCode]Max Area of Island 岛屿的最大面积
C++之重载数组下标[]与圆括号()运算符的方法 – 春风细雨's Blog
unity3d学习笔记(十七)unity3d读取csv文件
数字图像处理,相位相关算法解决图像的刚性平移问题
Cellchat细胞互作分析可视化:依然是解决问题
图像处理之Harris角度检测算法
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服