BiggestRectangle.cpp 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. // INPUT : a boolean matrix
  2. // OUPUT : the maximum true rectangle (bottom right corner, width, height)
  3. // COMPLEXITY : linear
  4. #define MAXX 1000
  5. // last x, width, height
  6. tuple<int, int, int> maxUnderHistogram(int sizes[], int N) {
  7. stack<pair<int, int> > s; // height, start
  8. int mx, mw = 0, mh = 0;
  9. for(int i = 0; i < N; i++) {
  10. int start = i;
  11. while(true) {
  12. if(s.empty() || sizes[i] > s.top().first) {
  13. s.emplace(sizes[i], start);
  14. break;
  15. }
  16. else if(!s.empty() && sizes[i] < s.top().first) {
  17. int w = i - s.top().second;
  18. if(w*s.top().first > mw*mh) {
  19. mx = i-1; mw = w; mh = s.top().first;
  20. }
  21. start = s.top().second;
  22. s.pop();
  23. }
  24. else
  25. break;
  26. }
  27. }
  28. while(!s.empty()) {
  29. int h, st;
  30. tie(h, st) = s.top();
  31. s.pop();
  32. int w = N-st;
  33. if(w*h > mw*mh) {
  34. mx = N-1; mw = w; mh = h;
  35. }
  36. }
  37. return make_tuple(mx, mw, mh);
  38. }
  39. // last x, last y, width, height
  40. tuple<int, int, int, int> biggestRectangle(bool table[][MAXX], int sizeY, int sizeX) {
  41. int mx, my, mw = 0, mh = 0;
  42. int mx2, mh2, mw2;
  43. int s[MAXX];
  44. memset(s, 0, sizeof(s));
  45. for(int y = 0; y < sizeY; y++) {
  46. for(int x = 0; x < sizeX; x++) {
  47. s[x] = table[y][x] ? s[x]+1 : 0;
  48. }
  49. tie(mx2, mw2, mh2) = maxUnderHistogram(s, sizeX);
  50. if(mw2*mh2 > mw*mh) {
  51. mx = mx2; my = y; mw = mw2; mh = mh2;
  52. }
  53. }
  54. return make_tuple(mx, my, mw, mh);
  55. }