1541. 【USACO Open 2012银】书架Bookshelf (File IO): input:bookshelf.in output:bookshelf.out 时间限制: 1000 ms 空间限制: 131072 KB 具体限制 Goto ProblemSet 题目描述 当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 数据范围限制 #include<iostream> #include<cstdio> #include<cmath> using namespace std; int a,b,c,i,j,v[2001][2001],ans[2001],f[2001],r[2001][2],ans1; int main() { freopen("bookshelf.in","r",stdin); freopen("bookshelf.out","w",stdout); scanf("%d%d",&a,&b); for (c=1;c<=a;c++) { scanf("%d%d",&r[c][1],&r[c][2]); ans[c]=ans[c-1]+r[c][2]; } for (i=1;i<=a;i++) { ans1=0; for (j=i;j>=1;j--) { ans1=max(ans1,r[j][1]); v[j][i]=ans1; } } for (i=1;i<=a;i++) f[i]=2147483647/2; f[0]=0; for (i=1;i<=a;i++) { for (j=0;j<=i-1;j++) { if (ans[i]-ans[j]<=b) f[i]=min(f[i],f[j]+v[j+1][i]); } } printf("%d\n",f[a]); }