試題 演算法提高 和諧宿舍2

2021-10-23 05:06:08 字數 1628 閱讀 4212

設f[i][j]表示覆蓋到i(i這個矩形已經被覆蓋)的時候用了j塊木板的面積最小值,然後我們列舉一下最後一塊木板覆蓋的矩陣是從k到i的(包括k和i矩形),轉移方程:f[i][j]=min(f[i][j],f[k-1][j-1]+max*len),其中max表示的是k到i矩形裡的高度最大的值,len是i-k+1,所以我們還要預處理出來區間最大值,這裡就可以用線段樹來實現.

#include

#include

#include

using

namespace std;

const

int n=

10010

;const

int inf=

0x3f3f3f3f

;int v[n]

;int f[n]

[n];

int m,n;

struct node tr[n*4]

;void

build

(int u,

int l,

int r);if

(l==r)

return

;int mid=

(l+r)

>>1;

build

(u<<

1,l,mid)

;build

(u<<1|

1,mid+

1,r);}

void

modify

(int u,

int x,

int v)

int mid=

(tr[u]

.l+tr[u]

.r)>>1;

if(x<=mid)

modify

(u<<

1,x,v)

;else

modify

(u<<1|

1,x,v)

; tr[u]

.v=max

(tr[u<<1]

.v,tr[u<<1|

1].v);

}int

query

(int u,

int l,

int r)

int res=0;

int mid=

(tr[u]

.l+tr[u]

.r)>>1;

if(l<=mid)res=

max(res,

query

(u<<

1,l,r));

if(r>mid)res=

max(res,

query

(u<<1|

1,l,r));

return res;

}int

main()

for(

int i=

1;i<=n;i++)}

for(

int i=

1;i<=n;i++)}

}int ans=inf;

for(

int i=

1;i<=m;i++

)ans=

min(ans,f[n]

[i])

; cout << ans;

}

藍橋試題 演算法提高 和諧宿舍2

我的某室友學過素描,牆上有n張他的作品。這些作品都是寬度為1,高度不定的矩形,從左到右排成一排,且底邊在同一水平線上。宿舍評比就要來了,為了及格,我們決定買不多於m塊的矩形木板,把這些作品和諧掉。要求木板也從左到右排成一排,且底邊與作品的底邊在同一水平線上。在能夠把所有作品和諧掉的前提下,我們希望這...

演算法提高 和諧宿舍2

問題描述 我的某室友學過素描,牆上有 n 張他的作品。這些作品都是寬度為 1,高度不定的矩形,從左到右排成一排,且底邊在同一水平線上。宿舍評比就要來了,為了及格,我們決定買不多於 m 塊的矩形木板,把這些作品和諧掉。要求木板也從左到右排成一排,且底邊與作品的底邊在同一水平線上。在能夠把所有作品和諧掉...

藍橋杯 演算法提高 和諧宿舍2

題目描述 題目描述 我的某室友學過素描,牆上有n張他的作品。這些作品都是寬度為1,高度不定的矩形,從左到右排成一排,且底邊在同一水平線上。宿舍評比就要來了,為了及格,我們決定買不多於m塊的矩形木板,把這些作品和諧掉。要求木板也從左到右排成一排,且底邊與作品的底邊在同一水平線上。在能夠把所有作品和諧掉...