您的位置:首页 > 运维架构

jzoj P1541 【USACO Open 2012银】书架Bookshelf

2017-03-11 14:13 260 查看
题目描述

当FJ不在为奶牛挤奶、打包包裹、将他的奶牛排成一队、或是砌栅栏的时候,他喜欢坐着看一本好书。多年来他收集了N(1 <= N <= 2,000)本书,他想建立一套新的书架来保存他的书。

每本书宽W(i),高度为H(i)。书需要被按照顺序地放进书架,比如:第一个书架放了k本书,那应该是第1本到第k本,第二个书架放的书应该以第k+1本开始。每个书架可以存放宽度和至多为L(1 <= L <=1,000,000,000)的书,这个书架的高度应该是他所放的书中最高的一本书的高度。整套书架的高度为每个书架高度之和。每本书应该垂直的放在书架里。

请帮助FJ计算这套书架最小可能的高度值。

输入

第1行:两个用空格隔开的整数:N, L

第2行至第n + 1行:第i +1行有两个用空格隔开的整数:H(i), W(i)

(1 <= H(i) <= 1,000,000; 1 <= W(i) <= L)


输出

一行,这套书架最小可能的高度值。

样例输入

5 10

5 7

9 2

8 5

13 2

3 8

样例输出

21

数据范围限制

题解:

DP:

因为是按顺序放的,可设sum[i]表示前i本的总宽度,设a[i,j]表示i到j之间最高的书本高度,f[i]表示前i本书这套书架最小可能的高度值。

f[i]=min(f[j]+a[j+1,i],f[i])

如果前j本书这套书架最小可能的高度值加上第j+1本到第i本的最高高度,小于已知的最优解,就替换。

时间复杂度:O(N log N)

var
a:array [0..2001,0..2001] of longint;
sum,f,h:array [0..2001] of longint;
i,j,n,w,max,l:longint;
begin
assign(input,'bookshelf.in'); reset(input);
assign(output,'bookshelf.out'); rewrite(output);
readln(n,l);
for i:=1 to n do
begin
readln(h[i],w);
sum[i]:=sum[i-1]+w;
end;
for i:=1 to n do
begin
max:=0;
for j:=i downto 1 do
begin
if h[j]>max then max:=h[j];
a[j,i]:=max;
end;
end;
for i:=1 to n do f[i]:=maxlongint div 2;
f[0]:=0;
for i:=1 to n do
for j:=0 to i-1 do
if (sum[i]-sum[j]<=l) then
if f[j]+a[j+1,i]<f[i] then f[i]:=f[j]+a[j+1,i];
writeln(f
);
close(input); close(output);
end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: