原題:
題解:給一些障礙物,求最大矩形的面積,不能覆蓋障礙物。懸線概念:
有效豎線:除了兩個端點外,不覆蓋任何障礙點的豎直線段。 懸線:上端點覆蓋了乙個障礙點或達到整個矩形上端的有效豎線。
每個懸線都與它底部的點一 一對應。每個懸線可以向左右擴充套件就會得到乙個矩形。最大矩形一定在這些矩形中。設:
h[i][j] 為點(i,j)懸線的長度
l[i][j] 為點(i,j)懸線向左最遠能達到的位置
r[i][j] 為點(i,j)懸線向右最遠能達到的位置
考慮狀態轉移
如果(i-1,j)是障礙點。(i,j)對應的懸線長度1,左右能移動到的位置是整個矩形的左右邊界。
如果不是。懸線長應該是h[i-1][j]+1。左端點應該是 max右端點應是min
細節:1.當長寬很大時要離散化。
2.沒有把上下邊界形成的矩形算上,要進行特判。
3.本題遞推時要用滾動陣列,並且表示位置的陣列要用short,不然mle
4.tag陣列最外一圈是邊界,離散化是座標要+1
#include#include#include#includeusing namespace std;
const int n=5005;
int x[n],y[n],sx[n],sy[n];
short pre[n][n],nxt[n][n];
short h[2][n],l[2][n],r[2][n];
bool tag[n][n];
int xcnt,ycnt,n,ans;
inline int rd()
while(isdigit(s)) x=(x<<1)+(x<<3)+s-'0',s=getchar();
return x*f;
}int main()
sort(sx+1,sx+xcnt+1);xcnt=unique(sx+1,sx+xcnt+1)-(sx+1);
sort(sy+1,sy+ycnt+1);ycnt=unique(sy+1,sy+ycnt+1)-(sy+1);
ans=0;
//特判 和上下邊界的矩型
for(int j=2;j<=ycnt;j++) ans=max(ans,(sy[j]-sy[j-1])*sx[xcnt]);
for(int i=1;i<=n;i++)
for(int i=1;i<=xcnt;i++) tag[i][1]=tag[i][ycnt]=1;
for(int j=1;j<=ycnt;j++) tag[1][j]=tag[xcnt][j]=1;
for(int i=1;i<=xcnt;i++)
} int t=1;
for(int j=1;j<=ycnt;j++) l[t][j]=1,r[t][j]=ycnt;
t^=1;
for(int i=2;i<=xcnt;i++,t^=1)else
ans=max(ans,(sx[i]-sx[i-h[t][j]])*(sy[r[t][j]]-sy[l[t][j]]));
} }
printf("%d\n",ans);
return 0;
}
P1578 奶牛浴場(懸線 極大值)
原題 題意 n m的矩陣,有幾個點 不是格仔而是座標點 問最大的沒有覆蓋這些點的矩陣。解析 首先搞清楚模型,1,1 和 4,4 是右邊的情況,因為給出的案例下面兩種答案都是80。這題雖然不能用懸線法 矩陣太大不可能列舉點 來做,但是可以用類似懸線的思想來做。對答案子矩陣進行分析,四個邊,如果沒有被約...
題解 P1578 奶牛浴場
題目鏈結 由於john建造了牛場圍欄,激起了奶牛的憤怒,奶牛的產奶量急劇減少。為了討好奶牛,john決定在牛場中建造乙個大型浴場。但是john的奶牛有乙個奇怪的習慣,每頭奶牛都必須在牛場中的乙個固定的位置產奶,而奶牛顯然不能在浴場中產奶,於是,john希望所建造的浴場不覆蓋這些產奶點。這回,他又要求...
洛谷P1578 奶牛浴場
由於john建造了牛場圍欄,激起了奶牛的憤怒,奶牛的產奶量急劇減少。為了討好奶牛,john決定在牛場中建造乙個大型浴場。但是john的奶牛有乙個奇怪的習慣,每頭奶牛都必須在牛場中的乙個固定的位置產奶,而奶牛顯然不能在浴場中產奶,於是,john希望所建造的浴場不覆蓋這些產奶點。這回,他又要求助於cle...