The Bookcase

题解

蛮简单的一道题

看到这道题应该很容易想到数位dp。但如果直接把高度,厚度全加到维度上去明显会MLE。

我们定义为前本书放到书架上第1行厚度为,第二行厚度为时的每行最大高度之和,第三行的厚度可以通过前缀和算出来。

由于不知道每行书的高度,我们可以先将所有的书根据高度排序,这样保证加进去时一行如果有书就一定不会增加高度,这样如果一行厚度为0就没书。

这样,很容易就可以得到状态转移方程式了,这里不列出。

时间复杂度

注意,三行都必须有书。

源码

#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<map>
#include<set>
using namespace std;
const int INF=0x7f7f7f7f;
typedef long long LL;
typedef unsigned long long uLL;
typedef pair<int,int> pii;
template<typename _T>
_T Fabs(_T x){return x<0?-x:x;}
template<typename _T>
void read(_T &x){_T f=1;x=0;char s=getchar();while(s>'9'||s<'0'){if(s=='-')f=-1;s=getchar();}while('0'<=s&&s<='9'){x=(x<<3)+(x<<1)+(s^48);s=getchar();}x*=f;
}
int n,dp[75][2105][1055],sum[75],maxx;
LL ans;
struct book{int h,t;}b[75];
bool cmp(book x,book y){return x.h>y.h;}
signed main(){int t;read(t);while(t--){read(n);maxx=0;memset(sum,0,sizeof(sum));memset(dp,0x7f,sizeof(dp));for(int i=1;i<=n;i++)read(b[i].h),read(b[i].t),maxx=max(b[i].h,maxx);sort(b+1,b+n+1,cmp);for(int i=1;i<=n;i++)sum[i]=sum[i-1]+b[i].t;dp[0][0][0]=0;ans=INF;//ans=1ll*sum[n]*maxx;for(int i=1;i<=n;i++)for(int j=0;j<=sum[i];j++)for(int k=0;k<min(sum[i]/2,sum[i]-j);k++){int l=sum[i]-j-k;LL las=ans;if(j==b[i].t)dp[i][j][k]=min(dp[i][j][k],dp[i-1][0][k]+b[i].h);else if(j>b[i].t)dp[i][j][k]=min(dp[i][j][k],dp[i-1][j-b[i].t][k]);if(k==b[i].t)dp[i][j][k]=min(dp[i][j][k],dp[i-1][j][0]+b[i].h);else if(k>b[i].t)dp[i][j][k]=min(dp[i][j][k],dp[i-1][j][k-b[i].t]);if(l==b[i].t)dp[i][j][k]=min(dp[i][j][k],dp[i-1][j][k]+b[i].h);else if(l>b[i].t)dp[i][j][k]=min(dp[i][j][k],dp[i-1][j][k]);if(i==n&&l&&j&&k)ans=min(ans,1ll*max(j,max(k,l))*dp[i][j][k]);//if(ans<las)printf("select%d %d %d %d %d\n",i,j,k,l,dp[i][j][k]);//if(i==6&&dp[i][j][k]<INF-1)printf("%d %d %d %d:%d\n",i,j,k,l,dp[i][j][k]);}printf("%lld\n",ans);}return 0;
}
/*
0 0 0
0 0 0
0 0 0
*/

谢谢!!!

[SP1839]The Bookcase相关推荐

  1. 新概念英语(1-37)Making a bookcase

    What is Susan's favourite color ? A:You're working hard, Georage. What are you doing? B:I am making ...

  2. BZOJ 1933 Shoi2007 Bookcase 书柜的尺寸

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

  3. uva12099 Bookcase ACM NWERC

    书上,作者分析很详细 #include<iostream> #include<algorithm> #include<math.h> #include<str ...

  4. HLG 1532 The Bookcase

    题意: 一个三层书架,现要把一些高度和厚度不等的书放进书架,每层至少放一本,问书架面积最少是多少,且要保证书架是矩形的. 分析: 先对书按从高到低排序,不妨把最高的一本书放在第一层,这样第一层的高度就 ...

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

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

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

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

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

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

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

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

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

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

最新文章

  1. NBT:人类微生物组千万基因的参考基因集
  2. 用户态程序调用系统态程序-快速系统调用
  3. 【线性回归】面向新手的基础知识
  4. LeetCode 1516. Move Sub-Tree of N-Ary Tree(DFS)
  5. web前端期末大作业--奥迪RS汽车主题官网设计(HTML+CSS+JavaScript)实现
  6. Python 链表内取随机数(list取随机数)
  7. 艰困之道中学到的经验教训
  8. Qt4_Quit按键
  9. ObjC学习10-Foundation框架之内存管理
  10. python 全部缩进一行_每天三分钟一起学python之(三)python的基本语法
  11. 57 Insert Interval
  12. 量化投资学习——统计套利综述
  13. xp自带打印驱动相关
  14. 用PS调出二次元风格水彩漫画风景图片
  15. Word插入脚注后分节符自动变成分页符 解决办法
  16. Ubuntu系统查看显卡型号
  17. Segment routing分段路由
  18. STMCubeMX+Proteus仿真DHT11(数码管显示)
  19. 24年前他被余承东招入华为,现在掌舵第四大事业群,对垒阿里张建锋、百度王海峰,腾讯汤道生
  20. 深度学习auc_深度学习-AUC/PR计算

热门文章

  1. pythonl list 的修改元素
  2. 京东1.8联合会员腾讯视频QQ音乐转手教程 京东app换绑
  3. What Plants Need to Grow
  4. 基于滴滴云安装 Docker 并上传镜像到滴滴云 Docker 仓库
  5. 成都精灵云-C++开发工程师-技术面经(30min左右)
  6. 3.6 使用透视裁剪工具修复透视图 [Ps教程]
  7. spring源码之Mybatis扫描器
  8. 利用C#2005为你的软件制作小精灵
  9. 现代OpenGL教程(六):鼠标和键盘(imgui+OpenGL3.3)
  10. 编译原理:理解文法和语文