1933: [Shoi2007]Bookcase 书柜的尺寸

Time Limit: 5 Sec  Memory Limit: 64 MB
Submit: 638  Solved: 251
[Submit][Status][Discuss]

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

抄自cydiater大神

很容易看出来这是一道DP题,那么怎么设置状态就成了这道题的关键。本题有点特殊的地方是有两个维度的状态,而每个维度又有三个部分的参数,如果全部设置出来的话肯定会MLE。首先对书的厚度状态简化。

书的厚度是求和的,这个显然不能作为状态的值,作为状态的参数是比较好的, 30*70=2100 2100^3是内存无法接受的,简化状态求出前i本书的前缀和sum[i],如果第一层的厚度是i,第二层的厚度是j,那么第三层的状态显然是sum[i]-j-k,bingo,内存的问题解决了。显然两个维度一个维度表状态另一个维度显然表示权值。但是问题是,书是三层的高度,不可能把每一层都暴力表示出来,所以巧妙的地方是把书的高度递减排序。然后这个问题就显然很好解决了。

#include <bits/stdc++.h>
#define ll long long
#define inf 10000010
#define eps 1e-7
using namespace std;
inline int read(){int x=0;int f=1;char ch=getchar();while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();}return x*f;
}
const int MAXN=2105;
namespace zhangenming{struct node{int h,v;}a[80];inline bool mycmp(node xx,node yy){return xx.h>yy.h;}   int n,lim=0,f[2][MAXN][MAXN];int sum[80];int sta=0;void init(){n=read();memset(sum,0,sizeof(sum));for(int i=1;i<=n;i++){a[i].h=read();a[i].v=read();lim+=a[i].v;}sort(a+1,a+n+1,mycmp);for(int i=1;i<=n;i++){sum[i]=sum[i-1]+a[i].v;}}void dp(){memset(f,10,sizeof(f));f[sta][0][0]=0;int t,h;for(int i=1;i<=n;i++){sta^=1;memset(f[sta],10,sizeof(f[sta]));t=a[i].v;h=a[i].h;for(int j=0;j<=sum[i-1];j++){for(int k=0;k<=sum[i-1];k++){if(f[sta^1][j][k]>1000000) continue;if(j+k>sum[i-1]) continue;if(k==0) f[sta][j][t]=min(f[sta][j][t],f[sta^1][j][k]+h);else f[sta][j][k+t]=min(f[sta][j][k+t],f[sta^1][j][k]);if(j==0) f[sta][t][k]=min(f[sta][t][k],f[sta^1][j][k]+h);else f[sta][j+t][k]=min(f[sta][j+t][k],f[sta^1][j][k]);if(sum[i-1]-j-k==0) f[sta][j][k]=min(f[sta][j][k],f[sta^1][j][k]+h);else f[sta][j][k]=min(f[sta][j][k],f[sta^1][j][k]);}}}}void output(){int ans=10000000;for(int i=1;i<=lim;i++){for(int j=1;j<=lim;j++){if(i+j<sum[n]&&f[sta][i][j]<=10000){ans=min(ans,max(max(i,j),sum[n]-i-j)*f[sta][i][j]);}}}cout<<ans<<endl;}
}
int main(){using namespace zhangenming;init();dp();output();return 0;
}

  

转载于:https://www.cnblogs.com/something-for-nothing/p/7888831.html

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

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

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

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

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

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

    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. Codeforces Round #621题解
  2. springBoot 搭建web项目(前后端分离,附项目源代码地址)
  3. DDoS高防服务如何选择?
  4. C1之路 | 训练任务02-网络
  5. 蓝桥杯-最小乘积(java)
  6. python2/3 中删除字典中value为空的键值对方法
  7. 【企业管理】人力资源-华为实践
  8. 在理解通用近似定理之前,你可能都不会理解神经网络
  9. 计算机类会议论文2021截稿,科学网—人工智能 | 国际会议截稿信息3条 - 李昕的博文...
  10. HTTPS 路径配置
  11. 【SDOI2018】战略游戏【圆方树】【虚树】
  12. python创建sqlite3数据库_树莓派使用 Python + SQLite 建立温度数据库
  13. c语言中欧几里得模乘法逆元,扩展欧几里得算法同余方程模m乘法逆元详解
  14. linux安装trac+svn+apache+wike,apache+svn+trac安装及配置2
  15. 今天实现了一个功能就是,树结点的拖动
  16. 【服务器】【个人网盘】宝塔安装NextCloud
  17. java文件读取路径_java文件读取路径问与答
  18. Jmeter 面试题
  19. 学好算法,真的需要智商吗?
  20. 835616-60-9,4-Fluoro-thalidomide用于补充CRBN蛋白的沙利度胺基脑啡肽配体

热门文章

  1. android 手机开门,别羡慕安卓手机能开门!苹果手机也能用作门禁卡,回家一碰就开门...
  2. 图片水中倒影 【js读书笔记】
  3. 利用perf及FlameGraph生成火焰图
  4. 菜鸟ACM职业生涯模板总结
  5. java音乐剪辑代码(只能剪辑从开始到最后的部分,也可以中间截取,加个计数器就行了)
  6. 语录分享 ——许逊真君《警世格言》
  7. android 9坚果r1,「旗舰」坚果R1开箱,红蓝荧光照亮细细的红线
  8. 俄罗斯文学一瞥——鲁迅《穷人》小引
  9. CSDN:《新程序员003》正式上市,华为、阿里等 30+ 公司的云原生及数字化实战经验
  10. 用python进行yahoo股票数据分析(tushare接口数据)