Description

Tom不喜欢那种一字长龙式的大书架,他只想要一个小书柜来存放他的系列工具书。Tom打算把书柜放在桌子的后面,这样需要查书的时候就可以不用起身离开了。显然,这种书柜不能太大
,Tom希望它的体积越小越好。另外,出于他的审美要求,他只想要一个三层的书柜。为了物尽其用,Tom规定每层必须至少放一本书。现在的问题是,Tom怎么分配他的工具书,才能让木匠造出最小的书柜来呢? Tom很快意识到这是一个数学问题。每本书都有自己的高度hi和厚度ti。我们需要求的是一个分配方案,也就是要求把所有的书分配在S1、S2和S3三个非空集合里面的一个,不重复也不遗漏,那么,很明显,书柜正面表面积(S)的计算公式就是: 由于书柜的深度是固定的(显然,它应该等于那本最宽的书的长度),所以要求书柜的体积最小就是要求S最小。Tom离答案只有一步之遥了。不过很遗憾,Tom并不擅长于编程,于是他邀请你来帮助他解决这个问题。

Input

文件的第一行只有一个整数n(3≤n≤70),代表书本的本数。接下来有n行,每行有两个整数hi和ti,代表每本书的高度和厚度,我们保证150≤hi≤300,5≤ti≤30。

Output

只有一行,即输出最小的S。

Sample Input

4
220 29
195 20
200 9
180 30

Sample Output

18000

HINT

传送门
一道还可以的dp……
我们可以令dp[p][i][j]表示前p本书,第一层总宽度为i,第二层总宽度为j的最小高度。
那么第三层总宽度为sum-i-j,
由于放入第p本书我们需要判断它放在某一层是不是最高的,
那么我们可以把所有书按照高度降序排序,
这样子我们就可以知道,当这层已经放了书,第p本书肯定不是最高的书了。
然后根据第p本书放在哪一层,可以从p-1转移过来。
考虑到空间会炸,,可以把p滚动掉。
注意一下题目里说了每层都要放至少一本……
这个地方错了好久。。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int read(){int f=1,x=0;char ch=getchar();while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}
const int N=75,maxw=2101;
int n,inf,sumW[N];
int f[2][maxw][maxw];
struct BOOK{int H,W;
}a[N];
bool cmp(BOOK x,BOOK y){return x.H>y.H;
}
int main(){n=read(),sumW[0]=0;for (int i=1;i<=n;i++)a[i].H=read(),a[i].W=read();sort(a+1,a+1+n,cmp);for (int i=1;i<=n;i++) sumW[i]=sumW[i-1]+a[i].W;memset(f,60,sizeof(f));inf=f[0][0][0];f[0][0][0]=0;for (int p=1;p<=n;p++){int now=p&1,pre=now^1;memset(f[now],60,sizeof(f[now]));for (int i=0;i<=sumW[p];i++)for (int j=0;j<=sumW[p];j++){if (f[pre][i][j]>=inf) continue;if (i+a[p].W<=sumW[n])if (!i) f[now][i+a[p].W][j]=min(f[now][i+a[p].W][j],f[pre][i][j]+a[p].H);else f[now][i+a[p].W][j]=min(f[now][i+a[p].W][j],f[pre][i][j]);if (j+a[p].W<=sumW[n])if (!j) f[now][i][j+a[p].W]=min(f[now][i][j+a[p].W],f[pre][i][j]+a[p].H);else f[now][i][j+a[p].W]=min(f[now][i][j+a[p].W],f[pre][i][j]);if (sumW[p-1]-i-j) f[now][i][j]=min(f[now][i][j],f[pre][i][j]);else f[now][i][j]=min(f[now][i][j],f[pre][i][j]+a[p].H);}}ll ans=inf;for (int i=1;i<=sumW[n];i++)for (int j=1;j<=sumW[n];j++)if (sumW[n]-i-j)ans=min(ans,max((ll)i,max((ll)j,(ll)(sumW[n]-i-j)))*(ll)f[n&1][i][j]);cout<<ans<<endl;return 0;
}

BZOJ 1933 [Shoi2007]Bookcase 书柜的尺寸 动态规划相关推荐

  1. BZOJ 1933 [Shoi2007]Bookcase 书柜的尺寸 ——动态规划

    状态设计的方法很巧妙,六个值 h1,h2,h3,t1,t2,t3,我们发现t1,t2,t3可以通过前缀和优化掉一维. 然后考虑把h留下还是t留下,如果留下h显然t是会发生改变的,一个int存不下. 如 ...

  2. BZOJ 1933 Shoi2007 Bookcase 书柜的尺寸

    1933: [Shoi2007]Bookcase 书柜的尺寸 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 638  Solved: 251 [Subm ...

  3. [BZOJ]1933: [Shoi2007]Bookcase 书柜的尺寸 DP

    Description Tom不喜欢那种一字长龙式的大书架,他只想要一个小书柜来存放他的系列工具书.Tom打算把书柜放在桌子的后面,这样需要查书的时候就可以不用起身离开了.显然,这种书柜不能太大,To ...

  4. BZOJ 1933 [Shoi2007] Bookcase 书柜的尺寸

    Description Tom不喜欢那种一字长龙式的大书架,他只想要一个小书柜来存放他的系列工具书.Tom打算把书柜放在桌子的后面,这样需要查书的时候就可以不用起身离开了.显然,这种书柜不能太大,To ...

  5. BZOJ 1933 [Shoi2007]Bookcase 书柜的尺寸

    神奇的dp优化. 考虑6维状态的dp,分别表示三行高和宽,显然MLE&&TLE. 把高排个序,从大到小往架上放,那么若不是重开一行便对高度没有影响. 然后求出宽度的sum,dp[i][ ...

  6. bzoj 1933: [Shoi2007]Bookcase 书柜的尺寸

    题意:给出n本书的高度和厚度,把它们放在三行的书架上(每一行至少一本书),问书架正面的最小面积. 题解:先按高度从大到小排序,保证后面加入的书不会对高度造成影响,再dp.f[i][j][k]f[i][ ...

  7. Bzoj1933 [Shoi2007]Bookcase 书柜的尺寸

    Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 554  Solved: 212 Description Tom不喜欢那种一字长龙式的大书架,他只想要一个 ...

  8. [Shoi2007]Bookcase 书柜的尺寸 dp

    这道dp算是同类型dp中比较难的了,主要难点在于设置状态上: 如果像平时那样设置,必定爆空间没商量: 下面是一种思路: 先把输入进来的数据按h从大到小排序,这样就可以大大减少状态数, 然后设f[i][ ...

  9. bzoj1933: [Shoi2007]Bookcase 书柜的尺寸

    传送门 S前面那一坨就是max(hi) 然后就是大力dp 设f[i][j][k]表示前i本书,第一层长度和为j,第二层长度和为k的最小第三层长度. 显然可以滚掉一维 转移十分简单. #include& ...

最新文章

  1. 从实习被劝退,到收获阿里腾讯的offer,谈谈读研给我带来的转变
  2. Nginx配置文件粗解
  3. 积极开展网络营销的AI换脸软件短短几日经历了从爆红到下架
  4. android listview 中的checkbox,Android中ListView与CheckBox的使用,及问题解决
  5. 关于armv7指令集的一个直观数据
  6. ShardingSphere(五) 公共表配置,实现读写改操作
  7. Java学习笔记2.1.2 Java基本语法 - Java三种注释方式
  8. 利用空余时间在完成一个Outlook框架控件,还有些Bug,完善中
  9. QEMU 源代码阅读经验开山之作
  10. istio组件介绍和启动流程
  11. java的两种核心机制(一)
  12. C++--第11课 - 类的静态成员
  13. linux 定时任务 数量 性能,Linux 性能测试与分析
  14. ODrive AP调试记录
  15. 每周推荐阅读第一季结束
  16. dolphinscheduler 补数据
  17. 社交舞 - 简介,释名,风格,舞步 - 金山词霸汉语 - HAPPY Life
  18. 博途PLC 中位值滤波算法(FC功能块)
  19. Mac中iterm2显示彩色
  20. 最大回撤线性算法实现

热门文章

  1. python返回上一个交易日
  2. 菊风:一分钟,带你了解 RCS Native
  3. 关于c++的qt官方网站下载慢的解决方案(qt的下载方法,清华镜像)
  4. 时间序列预测分析(2)How to Develop a Skillful Machine Learning Time Series Forecasting Model
  5. 【POJ 1475】 Pushing Boxes
  6. getActivePinia was called with no active Pinia.
  7. 大众点评坐标抓取php,如何抓取(采集)大众点评网的坐标(经纬度)信息
  8. html只选择年份,原生jQuery实现只显示年份下拉框
  9. mysql 查询当前年份
  10. 银河麒麟root用户自动登录