設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塊的矩形木板,把這些作品和諧掉。要求木板也從左到右排成一排,且底邊與作品的底邊在同一水平線上。在能夠把所有作品和諧掉...