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

Source

Day2

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

DP+思路~

求最大高、之和,和最大、宽之和的乘积的最小值~(注意断句!)

首先,我们可以用f[i][j][k][z]表示目前DP到第i本书,三个柜的书的宽度分别为j,k,z的最小的最大高的值,但是显然像这样所有维度都记录的话会MLE,所以我们只能记录一部分的状态。

注意到DP到i时,已有的书的宽度之和是一定的,所以我们只需要记录三块中的两块的宽度之和就可以了。而i对递推过程无影响,所以把i维换成滚动形式。

所以用f[kkz][j][k]表示目前用kkz^1更新kkz,三个书柜宽度分别为j,k,sum[i-1]-j-k的最小的最大高度,然后预处理出宽度的前缀和sum[i],直接DP即可~

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;int n,f[2][2101][2101],inf,kkz,sum[71],h,w,ans;struct node{int h,w;
}a[71];bool operator <(node u,node v)
{return u.h>v.h;
}int read()
{int totnum=0,f=1;char ch=getchar();while(ch<'0' || ch>'9') {if(ch=='-') f=-1;ch=getchar();}while(ch>='0' && ch<='9') {totnum=(totnum<<1)+(totnum<<3)+ch-'0';ch=getchar();}return totnum*f;
}int main()
{n=read();for(int i=1;i<=n;i++) a[i].h=read(),a[i].w=read();memset(f[kkz],127/3,sizeof(f[kkz]));ans=inf=f[kkz][0][0];f[kkz][0][0]=0;sort(a+1,a+n+1);for(int i=1;i<=n;i++) sum[i]=sum[i-1]+a[i].w;for(int i=1;i<=n;i++){kkz^=1;h=a[i].h;w=a[i].w;memset(f[kkz],127/3,sizeof(f[kkz]));for(int j=sum[i-1];~j;j--)for(int k=sum[i-1];~k;k--)if(j+k<=sum[i-1] && f[kkz^1][j][k]<inf){if(j) f[kkz][j+w][k]=min(f[kkz][j+w][k],f[kkz^1][j][k]);else f[kkz][w][k]=min(f[kkz][j][k],f[kkz^1][j][k]+h);if(k) f[kkz][j][k+w]=min(f[kkz][j][k+w],f[kkz^1][j][k]);else f[kkz][j][w]=min(f[kkz][j][w],f[kkz^1][j][k]+h);if(j+k<sum[i-1]) f[kkz][j][k]=min(f[kkz][j][k],f[kkz^1][j][k]);else f[kkz][j][k]=min(f[kkz][j][k],f[kkz^1][j][k]+h);}}for(int i=1;i<sum[n];i++)for(int j=1;j<sum[n];j++)if(i+j<sum[n] && f[kkz][i][j]<inf)ans=min(ans,max(max(i,j),sum[n]-i-j)*f[kkz][i][j]);printf("%d\n",ans);return 0;
}

BZOJ 1933 [Shoi2007] Bookcase 书柜的尺寸相关推荐

  1. BZOJ 1933 Shoi2007 Bookcase 书柜的尺寸

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. 6.没有Release文件。N:无法安全地用该源进行更新,所以默认禁用该源解决
  2. linux下使用expect+scp+shell实现分布式集群系统安装,升级,部署
  3. python操作xlsx文档
  4. fastreport dll_报表如何连接到VistaDB嵌入式数据库?FastReport.Net轻松搞定
  5. LeetCode 396. 旋转函数(Rotate Function)
  6. Jmeter入门1 官网下载及安装
  7. 充一次电使用一年的手机_超级手机电池:充一次电用一年多?
  8. 快速傅里叶变换学习笔记(更新中)
  9. J2EE的13种核心技术(一)
  10. WPF 分享一种设置程序保存配置文件的方法
  11. R语言绘图大小及图例问题
  12. android pickerview 多行,Android仿ios条件选择器pickerview
  13. wps生成正态分布的随机数_生成服从标准正态分布的随机数
  14. 云服务器申请退款,腾讯云服务器申请自助退款的操作流程及图文教程
  15. matlab出图时汉字都变成方框,linux下Matlab 2020中文字体方框问题解决方法
  16. 通过Charmed Ceph 在 H3C UniServer R4950 G5 服务器上 部署独立的Ubuntu Ceph 存储集群
  17. 射影几何----用交比证明著名的梅涅劳斯定理
  18. 一文读懂网站SEO优化国际版
  19. 龙族幻想导入数据id_App Annie 7月报告:跑跑卡丁车、龙族幻想首次上榜,全球iOS收入前3均被腾讯包揽...
  20. Uboot的使用-1

热门文章

  1. 一图解析JavaScript快速排序原理,看了就不会忘~~
  2. windows2003系统修复
  3. 联想的锋行计算机,史上最牛PC 联想最新锋行king台机评测
  4. Android Paint学习总结
  5. chrome插件上传csv_赶快卸载!微软新公布了18个流氓浏览器插件!
  6. 我们需要一台怎么样的车载空气净化器?
  7. 力扣 1832. 判断句子是否为全字母句
  8. python登录网页版易信_web/wap网页分享新手指南-易信开放平台
  9. python爬虫爬取图片无法打开_半小时入门python爬虫爬下网站图片,不能再简单了...
  10. 160809610袁韬淳 补发作业