dp

如果我们直接定义状态:

\(dp[i][t1][t2][t3][h1][h2][h3]\)表示前i个,第一层宽度为t1,,第二层宽度为t2,第三层宽度为t3,第一层高度为h1,第二层高度为h2,第三层高度为h3的最小面积。

如果直接这样定义,你会发现,你不仅内存炸飞,时间也会T的飞起。

考虑优化状态。

1.首先,你会发现,面积可以直接用t1,t2,t3,h1,h2,h3算出来,所以我们不妨砍掉一维

2.列一波状态转移方程,你会发现,i只会从i-1转移过来,于是又可以把第一维滚动

3.不难发现,\(t1+t2+t3=\sum _{j=1}^{j \le i} t_j\)于是只用知道t1,t2,t3中的任意两个,就可以推出第三个

那么,状态就优化成了:\(dp[0/1][t1][t2][h1][h2]\)表示前i个,第一层宽度为t1,,第二层宽度为t2,第一层高度为h1,第二层高度为h2,的第三层最小高度。

然后,你又会发现,内存和时间依旧承受不住。。。

仔细琢磨一下,不难观察到,每一层的高度是这一层中所放书本的最大值,那么如果按照一定顺序插入书本,高度不就可以省略掉了吗?

因此,我们先把书本按高度从大到小排个序,这样每层的高度就是第一次插入到这层书的高度,于是状态又优化成了:\(dp[0/1][t1][t2]\)表示前i个,第一层宽度为t1,第二层宽度为t2,的最小三层总高度

转移的话就不用多说了吧。。。

代码:

注意一点,每层至少得有1本书,因此最后算面积时要排除某一层没有书的情况。(第二组样例已经良心地说明了这点)

#include<bits/stdc++.h>
using namespace std;
int n,dp[2][2110][2110],sum[101],ans=(1<<30);
struct node{int t,h;
}A[1010];
bool cmp(node A,node B){return A.h>B.h;
}
int main(){scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d %d",&A[i].h,&A[i].t);memset(dp,63,sizeof(dp));const int oo=dp[0][0][0];sort(A+1,A+1+n,cmp);for(int i=1;i<=n;i++)sum[i]=sum[i-1]+A[i].t;dp[0][0][0]=0;for(int i=1;i<=n;i++){int now=i&1,la=!now;memset(dp[now],63,sizeof(dp[now]));for(int j=0;j<=sum[i-1];j++){for(int k=0;k<=sum[i-1];k++){int o=sum[i-1]-j-k;if(o<0)continue;if(dp[la][j][k]==oo)continue;if(j==0)dp[now][j+A[i].t][k]=min(dp[now][j+A[i].t][k],dp[la][j][k]+A[i].h);else dp[now][j+A[i].t][k]=min(dp[now][j+A[i].t][k],dp[la][j][k]);if(k==0)dp[now][j][k+A[i].t]=min(dp[now][j][k+A[i].t],dp[la][j][k]+A[i].h);else dp[now][j][k+A[i].t]=min(dp[now][j][k+A[i].t],dp[la][j][k]);if(o==0)dp[now][j][k]=min(dp[now][j][k],dp[la][j][k]+A[i].h);else dp[now][j][k]=min(dp[now][j][k],dp[la][j][k]);}}}for(int i=1;i<=sum[n];i++){for(int j=1;j<=sum[n];j++){int o=sum[n]-i-j;if(o<=0)continue;if(dp[n&1][i][j]==oo)continue;ans=min(ans,max(max(i,j),o)*dp[n&1][i][j]);}}cout<<ans;return 0;
}

转载于:https://www.cnblogs.com/SillyTieT/p/11415298.html

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

  1. [JSOI] 快递服务 [SHOI] 书柜的尺寸 优化dp

    [JSOI2010]快递服务 朴素思想 : f(i,a,b,c)f(i,a,b,c)f(i,a,b,c) 表示前 iii 个订单,三个快递员分别在 a,b,ca,b,ca,b,c 那么可得: f(i+ ...

  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 书柜的尺寸 动态规划

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

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

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

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

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

  6. 【SHOI2007】【dp】书柜的尺寸

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

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

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

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

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

  9. 【SHOI2007/BZOJ1933】书柜的尺寸 dp

    原题走这里 目前见过的DP中算是思维难度比较大的了,其主要原因在于我太菜了 本题问的是书柜总高度*书柜长度的最小值,这种情况下,我们应当将其中一个作为状态,另外一个作为代价,然后统计得到最小值. 于是 ...

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

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

最新文章

  1. 查询linux kafka安装目录,Linux下安装并(单节点)配置启动Kafka
  2. python网络爬虫---selenium的使用
  3. JAVA基础中容易踩坑的知识点
  4. linux8系统安装总结,硬盘安装Ubuntu 8.04经验总结(图)
  5. OpenCV使用蒙版mask过滤图像的实例(附完整代码)
  6. spring aop搭建(2) :基于代码的实现
  7. Lvs Tun隧道模式配置
  8. Oracle入门(十)之概要文件
  9. css权威指南 note2
  10. TCP传输的三次握手四次挥手策略
  11. php文字音频插件下载安装,Goodhertz音频插件下载
  12. NS3 之 入坑
  13. 基于四叉树的图像压缩问题
  14. 微信小程序头像怎么改变形状_微信小程序 open-data更改样式 open-data 显示头像 圆形...
  15. C++multimap 003:冷血格斗场
  16. 透视变换原理、相机成像、灭点
  17. 拉格朗日乘子法(Lagrange Multiplier)详解以及乘子lambda的意义
  18. 安利 3 个 pandas 数据探索分析神器!
  19. 领域驱动设计详解:是什么、为什么、怎么做?
  20. idea同时打胖包和瘦包的方法

热门文章

  1. 给定只含 I(增大)或 D(减小)的字符串 S ,令 N = S.length。
  2. 安装mysql nignix_Node.js 蚕食计划(四)—— Express + SQL Server 搭建电影网站
  3. 计算机无法识别华为usb设备,计算机在使用过程中可识别USB3.0设备,无法识别USB2.0设备...
  4. 华为HMS游戏排行榜请求报错HTTP 502
  5. 在HTML如何将一张图片中的小图标显示出来
  6. 临潼智慧城市监督指挥中心国庆亮相 护航黄金周旅游
  7. oracle常用语法
  8. 基于个性化推荐的居舍优品商城的设计与实现(论文+源码)_kaic
  9. 黑马程序员——java概述和基础知识
  10. postgresql: 求和后再求平均值