P1578 奶牛浴場 懸線法 dp

2021-09-12 07:42:50 字數 1604 閱讀 7314

原題:

題解:給一些障礙物,求最大矩形的面積,不能覆蓋障礙物。懸線概念:

有效豎線:除了兩個端點外,不覆蓋任何障礙點的豎直線段。 懸線:上端點覆蓋了乙個障礙點或達到整個矩形上端的有效豎線。

每個懸線都與它底部的點一 一對應。每個懸線可以向左右擴充套件就會得到乙個矩形。最大矩形一定在這些矩形中。設:

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...