大佬部落格講解
o(s^2),s是障礙點的個數。
演算法思想:以每個障礙點作為極大子矩形的左邊界和右邊界,列舉所有的極大子矩形,再找出最大的子矩形,最後還要算一下遺漏的以範圍內的左邊界和右邊界為極大子矩形的左右邊框的矩形大小。
p1578 奶牛浴場
題目描述
由於john建造了牛場圍欄,激起了奶牛的憤怒,奶牛的產奶量急劇減少。為了討好奶牛,john決定在牛場中建造乙個大型浴場。但是john的奶牛有乙個奇怪的習慣,每頭奶牛都必須在牛場中的乙個固定的位置產奶,而奶牛顯然不能在浴場中產奶,於是,john希望所建造的浴場不覆蓋這些產奶點。這回,他又要求助於clevow了。你還能幫助clevow嗎?
john的牛場和規劃的浴場都是矩形。浴場要完全位於牛場之內,並且浴場的輪廓要與牛場的輪廓平行或者重合。浴場不能覆蓋任何產奶點,但是產奶點可以位於浴場的輪廓上。
clevow當然希望浴場的面積盡可能大了,所以你的任務就是幫她計算浴場的最大面積。
#include
using
namespace std;
const
int maxn =
1e5+7;
typedef
long
long ll;
struct node
}p[maxn]
;bool
cmp(node a, node b)
intmain()
}for
(int i = n; i >=
1; i--)}
sort
(p +
1, p +
1+ n, cmp)
;//列舉遺漏的情況
for(
int i =
1; i <= n -
1; i++
) ans =
max(ans,
(p[i +1]
.y - p[i]
.y)* l)
;printf
("%d\n"
, ans)
;return0;
}
o(nm)
演算法思想:懸線法。預處理出每個空閒點能往上連續的空閒點的最上位置,再處理出以該點為底邊的極大子矩形能擴充套件到左右的最遠的空閒寬度,然後直接長乘寬計算即可,主要是遞推的公式重要。
hdu1505
題意
給一塊nm的地,f表示空閒,r表示占用,求最大的空閒的矩形面積。
#include
using
namespace std;
const
int maxn =
1e3+7;
typedef
long
long ll;
//g是原圖 g[i][j] = 1表示所求的最大子矩形的組成元素
int g[maxn]
[maxn]
, u[maxn]
[maxn]
, l[maxn]
[maxn]
, r[maxn]
[maxn]
;char s[
100]
;//u是u[i][j]這個點的懸線的連續的1能延伸到最上面的地方
intmain()
//l是以g[i][j]這個點為底邊的最大子矩形的左邊界,r就是右邊界
}for
(int i =
1; i <= n; i++
)for
(int j = m; j >=
1; j--)}
for(
int i =
1; i <= n; i++
) ans =
max(ans,
(r[i]
[j]- l[i]
[j]+1)
*(i - u[i]
[j]+1)
);}}
printf
("%d\n"
, ans*3)
;//ans就是最大子矩形的面積,乘3是題目要求
}return0;
}
最大子矩形問題模板
用極大化思想解決最大子矩陣問題 演算法1 時間複雜度o s 2 s為障礙物個數 題目 奶牛浴場 include include include include include include define il inline define rg register define ll long lon...
最大子矩形
80 引數約定 0糖果盒 candy box 問題描述 乙個被分為 n m 個格仔的糖果盒,第 i 行第 j 列位置的格仔裡面有 a i j 顆糖。本來 tenshi 打算送這盒糖果給某 ppmm 的,但是就在要送出糖果盒的前一天晚上,乙隻極其可惡的老鼠夜襲糖果盒,有部分格仔被洗劫並且穿了洞。ten...
最大子矩形
乙個 n m 的矩陣中有 s 個位置是障礙,問最大的不包含障礙的矩形面積 最大子矩形問題 王知坤 對於這篇 吐槽無力 雖然實現.至少它的思路很對嘛 悲慘經歷 找到乙份題解,學學學學學學學。wa了。然後氣憤的測題解,wa了.每個極大子矩形的每一條邊外側一定有至少乙個障礙或與邊界重合,不然將邊向外移即可...