原題:
題意:
n*m的矩陣,有幾個點(不是格仔而是座標點),問最大的沒有覆蓋這些點的矩陣。
解析:
首先搞清楚模型,(1,1)和(4,4)是右邊的情況,因為給出的案例下面兩種答案都是80。
這題雖然不能用懸線法(矩陣太大不可能列舉點)來做,但是可以用類似懸線的思想來做。
對答案子矩陣進行分析,四個邊,如果沒有被約束,則會往外擴充套件。所以,四個邊一定被障礙點或大矩形邊界約束,這個就有點極大的意思在裡面了。
先按x值排序。
以乙個點作為左邊界,盡可能的往右延伸。遇到障礙點時調整上下界繼續延伸。
考慮到右邊界,需要用if判斷或將大矩陣的右上和右下放入點集。
但是考慮不到下圖中的情況,所以需要以每個點為右邊界,做一遍往左延伸。
最後一種橫穿的情況,只需要再次按y值排序遍歷即可。
有幾個剪枝:
往右延伸的時候,假設按照當前的上下界,即使延伸到右邊界都不能超過答案就break;
如果遇到和初始點相同的y值時,按理來說會被分解成兩個矩形。但是這兩個矩形可以證明一定會被除當前搜尋外的情況下考慮。下圖中,紅色部分在右邊界障礙點的左延中被考慮,黃色部分在最後按y值排序中,會得到比之更大的解。
// 不能得到更優解
break;}
u = m, d =
0, r = e[i]
.x;for
(int j = i -
1; j >=
1; j--)if
((u - d)
*(r -0)
<= ans)
break;}
}sort
(e +
1, e +
1+ c, cmp)
;for
(int i =
1; i < c; i++
)printf
("%d\n"
, ans)
;}
P1578 奶牛浴場 懸線法 dp
原題 題解 給一些障礙物,求最大矩形的面積,不能覆蓋障礙物。懸線概念 有效豎線 除了兩個端點外,不覆蓋任何障礙點的豎直線段。懸線 上端點覆蓋了乙個障礙點或達到整個矩形上端的有效豎線。每個懸線都與它底部的點一 一對應。每個懸線可以向左右擴充套件就會得到乙個矩形。最大矩形一定在這些矩形中。設 h i j...
題解 P1578 奶牛浴場
題目鏈結 由於john建造了牛場圍欄,激起了奶牛的憤怒,奶牛的產奶量急劇減少。為了討好奶牛,john決定在牛場中建造乙個大型浴場。但是john的奶牛有乙個奇怪的習慣,每頭奶牛都必須在牛場中的乙個固定的位置產奶,而奶牛顯然不能在浴場中產奶,於是,john希望所建造的浴場不覆蓋這些產奶點。這回,他又要求...
洛谷P1578 奶牛浴場
由於john建造了牛場圍欄,激起了奶牛的憤怒,奶牛的產奶量急劇減少。為了討好奶牛,john決定在牛場中建造乙個大型浴場。但是john的奶牛有乙個奇怪的習慣,每頭奶牛都必須在牛場中的乙個固定的位置產奶,而奶牛顯然不能在浴場中產奶,於是,john希望所建造的浴場不覆蓋這些產奶點。這回,他又要求助於cle...