bookshelf

探讨USACO竞赛中书架问题的算法实现,如何通过动态规划最小化书架高度,适合算法学习者深入理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

当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]);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值