【题目描述】

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

由于书柜的深度是固定的(显然,它应该等于那本最宽的书的长度),所以要求书柜的体积最小就是要求S最小。Tom离答案只有一步之遥了。不过很遗憾,Tom并不擅长于编程,于是他邀请你来帮助他解决这个问题。

【输入】

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

【输出】

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

【思路】

菜鸡博主刚开始的做法
对于这个题呢,由于tit_iti​非常小,所以很自然地想到∑ti\sum t_i∑ti​可能会作为dp的某维状态。由于高度不好处理,我们可以将所有的书按高度从大到小排序。这时我首先想到的是,钦定最高的书放第一层,枚举并钦定第二层和第三层最高的书。此时三层最高的书已经确定,即S的计算式的第一项已成为常数。由于当第二三层的∑ti\sum t_i∑ti​分别确定时,第一层的∑ti\sum t_i∑ti​也可随之确定,故可只定义两维度的f[i][j]=0/1f[i][j]=0/1f[i][j]=0/1表示第二层∑tk=i\sum t_k=i∑tk​=i且第三层∑tk=j\sum t_k=j∑tk​=j的这个状态能否达到0/10/10/1。剩下的便是一个普普通通的背包dp,把每本书放进满足它不高于钦定最高的书的层当中。可是这个幼稚的想法TLE了,只能获得70-80分。假如至此就没有想法了的话,注意到是最优化问题,我们可以考虑玄学一些,比如计算大致的时间复杂度,假如此时已经快超时了,就直接输出当前最优的结果,实际上这种方法在O2条件下可以把洛谷的所有数据骗过去。(可能还可以用bitset优化转移玄学过去。)
考虑优化:背包dp的维数和转移已经没什么可以优化的了,因此我们考虑优化一下状态定义和枚举最高的书这一步。我们不再枚举最高的书,而是用f[s][i][j]f[s][i][j]f[s][i][j]表示已经考虑前s本书的情况下,第二层∑tk=i\sum t_k=i∑tk​=i且第三层∑tk=j\sum t_k=j∑tk​=j的这个状态下第二层和第三层最高的书的高之和的最小值。这样我们就可以不枚举某一层是哪本书最高。由于已经按高度排序,故每层书架放入的第一本书即是最高的书,这时候用这本书的h更新一下f的值即可,其他时候只需要f之间相互更新。注意,由于空间限制,需要使用滚动数组优化空间。
代码

#include<bits/stdc++.h>
#define re register
#define F(i,a,b) for(int re i=a;i<=b;++i)
#define D(i,a,b) for(int re i=a;i>=b;--i)
using namespace std;
const int N=2505;
inline int red(){int re data=0,w=1;char re ch=getchar();while(ch!='-' && (ch<'0' || ch>'9'))ch=getchar();if(ch=='-') w=-1,ch=getchar();while(ch>='0' && ch<='9') data=(data<<3)+(data<<1)+(ch^48),ch=getchar();return data*w;
}
int f[2][N][N],h[N],t[N],id[N],mn=2e9,sumt=0,n;
inline bool cmp(int x,int y){return h[x]>h[y];}
inline void cmin(int&x,int y){if(x>y)x=y;}
int main(){n=red();F(i,1,n)h[i]=red(),t[i]=red(),id[i]=i,sumt+=t[i];sort(id+1,id+n+1,cmp);memset(f,127/3,sizeof f);f[1][0][0]=h[id[1]];F(i,2,n){int now=id[i];int las=(i&1)^1;D(j,sumt,0)D(k,sumt-j,0){cmin(f[i&1][j][k+t[now]],f[las][j][k]+h[now]*(!k));cmin(f[i&1][j+t[now]][k],f[las][j][k]+h[now]*(!j));cmin(f[i&1][j][k],f[las][j][k]);}memset(f[las],127/3,sizeof f[las]); }F(i,1,sumt)F(j,1,sumt-i)if(f[n&1][i][j]<=900)cmin(mn,f[n&1][i][j]*max(sumt-i-j,max(i,j)));cout<<mn<<"\n";
}

【SHOI2007】【dp】书柜的尺寸相关推荐

  1. BZOJ 1933 Shoi2007 Bookcase 书柜的尺寸

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

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

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

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

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

  4. [BZOJ1933][Shoi2007]Bookcase 书柜的尺寸(DP)

    看到层数只有33,可以推断DP模型的维数一定和33有关. 一个模型:f[i][j][k]f[i][j][k]表示到了第ii本书,第11行的厚度之和为jj,第22行的厚度之和为kk时的最小总高度. 但这 ...

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

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

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

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

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

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

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

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

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

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

  10. 【SHOI2007】书柜的尺寸

    dp 如果我们直接定义状态: \(dp[i][t1][t2][t3][h1][h2][h3]\)表示前i个,第一层宽度为t1,,第二层宽度为t2,第三层宽度为t3,第一层高度为h1,第二层高度为h2, ...

最新文章

  1. iOS网络缓存扫盲篇
  2. 中了Globelmposter3.0,后缀为4444怎么解决勒索病毒解密
  3. ntp服务器查看状态命令ntpstat及ntpq -p 说明及差别详解
  4. Mysql常见的面试总结
  5. simuvex 符号分析形象解释
  6. docker hub push_如何制作Docker镜像(image)?
  7. Skype for business 界面自动弹出打开
  8. 字节跳动重大宣布:取消!员工炸了:直接降薪1
  9. Centos7.5部署MySQL5.7基于GTID主从复制+并行复制+半同步复制+读写分离(ProxySQL) 环境- 运维笔记 (完整版)...
  10. Android 免root抓包
  11. Excel数据透视表系列培训--课时2
  12. 详解最近公共祖先(LCA)
  13. 3D打印机开源项目遭克隆或成开源拐点
  14. 监视Oracle ASM磁盘组上的空间使用情况(空闲和已用)
  15. 深度学习设备购置RTX 2080Ti + i7 9700k+ Z390 A主板
  16. MinIO按前缀批量下载文件到本地
  17. 信息系统项目管理师考试大纲知识点汇总
  18. Eclipse的物联网架构(Eclipse IoT Architectures)
  19. 如何选择一款好的护眼台灯?2022性价比最高的护眼台灯推荐
  20. python打造拳皇97电玩游戏,不信有开源API?先看我玩把八神庵

热门文章

  1. 程序人生:我们工作到底为了什么
  2. 【PVE7.1-8】LXC容器下Jellyfin服务器配置显卡硬件加速
  3. Excel中点击、双击,表格和状态栏以及编辑区出现黑色背景
  4. svg画一个宽100长200的立方体展开图形代码
  5. 数据分析~数据可视化-seaborn
  6. 小白python教程_面向小白的Python教程:入门篇(三)
  7. 成本高、落地难、见效慢,开源安全怎么办?
  8. Word文档批量生成工具分享
  9. 骨感蓝牙耳机什么品牌的好?骨感耳机最好的品牌推荐
  10. 掌握了这些技巧,电商直播带货就能高效完成