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

F[I][J][K]表示操作到第i本书,第一层的书的厚度为J,第二层书的厚度为K,则第三层的厚度为SUM[I]-I-J,记录的是最小的高度。(按照高度从小到大排序,这样就没有后效性了) 时间复杂度O(70*2100*2100),空间复杂度O(2*2100*2100) 开滚动数组

#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
#include<string>
#include<map>
#include<queue>
#include<vector>
#include<stack>
#define ll long long
#define maxn 4001000
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define PI 2*asin(1)
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define SWAP(x,y,t) ( (t)=(x),(x)=(y),(y)=(t) )
using namespace std;
struct node{int h,t;
}a[1010];
int f[2][2110][2110];
int n,sum[1010],ans=10101010;
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);sort(a+1,a+1+n,cmp);for(int i=1;i<=n;i++) sum[i]=sum[i-1]+a[i].t;memset(f,127/3,sizeof(f));f[0][0][0]=0;int sta=0;for(int i=1;i<=n;i++){sta=!sta;memset(f[sta],127/3,sizeof(f[sta]));for(int j=sum[i-1];j>=0;j--)for(int k=sum[i-1];k>=0;k--){if(j+k>sum[i-1]||f[!sta][j][k]>101010) continue;int t=a[i].t,h=a[i].h;if(j==0) f[sta][t][k]=min(f[sta][t][k],f[!sta][j][k]+h);else f[sta][j+t][k]=min(f[sta][j+t][k],f[!sta][j][k]);if(k==0) f[sta][j][t]=min(f[sta][j][t],f[!sta][j][k]+h);else f[sta][j][k+t]=min(f[sta][j][k+t],f[!sta][j][k]);if(sum[i-1]-k-j==0) f[sta][j][k]=min(f[sta][j][k],f[!sta][j][k]+h);else f[sta][j][k]=min(f[sta][j][k],f[!sta][j][k]);}}for(int i=1;i<sum[n];i++)for(int j=1;j<sum[n];j++)if(i+j<sum[n] && f[sta][i][j]<101010){ans=min(ans,max(max(i,j),sum[n]-i-j)*f[sta][i][j]);//printf("i=%d j=%d sum[n]=%d %d %d f[sta][i][j]=%d\n",i,j,sum[n],max(max(i,j),sum[n]-i-j)*f[sta][i][j],max(max(i,j),sum[n]-i-j),f[sta][i][j]);}printf("%d\n",ans);}

转载于:https://www.cnblogs.com/The-Pines-of-Star/p/9878812.html

BZOJ 1933 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 书柜的尺寸

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

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. Sharepoint the file is locked for use domain\user edit.文件被锁定,解锁方式
  2. 网络和大数据成为重要文化生产力
  3. 你们要的印度布线,这是一种极端的牛X
  4. Python pyenv
  5. Madagascar的自定义浮点型函数--对数函数
  6. 谷歌最新开源的工具可以自动化查找并修复 bug!
  7. mac 下tomcat 9.0+eclipse+mysql8.0.12配置相关问题
  8. rpcbind服务没法开启问题
  9. factoryreset恢复出厂设置测试
  10. 系统性能调优技术实战
  11. 膜拜性转帖: C++11有关的(现在用的编译器都是不太支持C++11的)
  12. 腾讯互娱开源分布式开发框架Pebble
  13. jsf的verbatim标签
  14. 水水水水水水水水水水水水水水水水水水水
  15. 同学,主业和副业如何选?
  16. Lync 2013 语言包安装
  17. 2022年9月最新【国际版阿里云的注册流程】分享
  18. Leetcode 345: Reverse Vowels of a String
  19. java每五分钟执行一次_Cron表达式每N分钟运行一次
  20. golang 1-helle golang

热门文章

  1. 结对编程--基于android平台的黄金点游戏(2.0版本)
  2. Daily Report 2012.10.30 刘宇翔
  3. silverlight将字符串转化为控件
  4. proxool数据库连接池使用方法
  5. 时间操作(JavaScript版)—页面显示格式:年月日 时分秒 星期
  6. javaScript遍历对象
  7. java 字符串和整型的相互转换
  8. in the java search_Java SearchRequest.indices方法代碼示例
  9. wingdings字体符号在哪_出版社编辑对标点符号和专业术语的要求
  10. ftp服务器通信协议设计,基于FTP协议的文件传输服务器的研究