BZOJ 1933 Shoi2007 Bookcase 书柜的尺寸
1933: [Shoi2007]Bookcase 书柜的尺寸
Time Limit: 5 Sec Memory Limit: 64 MB
Submit: 638 Solved: 251
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
220 29
195 20
200 9
180 30
Sample Output
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 书柜的尺寸相关推荐
- BZOJ 1933 [Shoi2007]Bookcase 书柜的尺寸 动态规划
Description Tom不喜欢那种一字长龙式的大书架,他只想要一个小书柜来存放他的系列工具书.Tom打算把书柜放在桌子的后面,这样需要查书的时候就可以不用起身离开了.显然,这种书柜不能太大 ,T ...
- [BZOJ]1933: [Shoi2007]Bookcase 书柜的尺寸 DP
Description Tom不喜欢那种一字长龙式的大书架,他只想要一个小书柜来存放他的系列工具书.Tom打算把书柜放在桌子的后面,这样需要查书的时候就可以不用起身离开了.显然,这种书柜不能太大,To ...
- BZOJ 1933 [Shoi2007] Bookcase 书柜的尺寸
Description Tom不喜欢那种一字长龙式的大书架,他只想要一个小书柜来存放他的系列工具书.Tom打算把书柜放在桌子的后面,这样需要查书的时候就可以不用起身离开了.显然,这种书柜不能太大,To ...
- BZOJ 1933 [Shoi2007]Bookcase 书柜的尺寸
神奇的dp优化. 考虑6维状态的dp,分别表示三行高和宽,显然MLE&&TLE. 把高排个序,从大到小往架上放,那么若不是重开一行便对高度没有影响. 然后求出宽度的sum,dp[i][ ...
- BZOJ 1933 [Shoi2007]Bookcase 书柜的尺寸 ——动态规划
状态设计的方法很巧妙,六个值 h1,h2,h3,t1,t2,t3,我们发现t1,t2,t3可以通过前缀和优化掉一维. 然后考虑把h留下还是t留下,如果留下h显然t是会发生改变的,一个int存不下. 如 ...
- bzoj 1933: [Shoi2007]Bookcase 书柜的尺寸
题意:给出n本书的高度和厚度,把它们放在三行的书架上(每一行至少一本书),问书架正面的最小面积. 题解:先按高度从大到小排序,保证后面加入的书不会对高度造成影响,再dp.f[i][j][k]f[i][ ...
- [Shoi2007]Bookcase 书柜的尺寸 dp
这道dp算是同类型dp中比较难的了,主要难点在于设置状态上: 如果像平时那样设置,必定爆空间没商量: 下面是一种思路: 先把输入进来的数据按h从大到小排序,这样就可以大大减少状态数, 然后设f[i][ ...
- Bzoj1933 [Shoi2007]Bookcase 书柜的尺寸
Time Limit: 5 Sec Memory Limit: 64 MB Submit: 554 Solved: 212 Description Tom不喜欢那种一字长龙式的大书架,他只想要一个 ...
- bzoj1933: [Shoi2007]Bookcase 书柜的尺寸
传送门 S前面那一坨就是max(hi) 然后就是大力dp 设f[i][j][k]表示前i本书,第一层长度和为j,第二层长度和为k的最小第三层长度. 显然可以滚掉一维 转移十分简单. #include& ...
最新文章
- Codeforces Round #621题解
- springBoot 搭建web项目(前后端分离,附项目源代码地址)
- DDoS高防服务如何选择?
- C1之路 | 训练任务02-网络
- 蓝桥杯-最小乘积(java)
- python2/3 中删除字典中value为空的键值对方法
- 【企业管理】人力资源-华为实践
- 在理解通用近似定理之前,你可能都不会理解神经网络
- 计算机类会议论文2021截稿,科学网—人工智能 | 国际会议截稿信息3条 - 李昕的博文...
- HTTPS 路径配置
- 【SDOI2018】战略游戏【圆方树】【虚树】
- python创建sqlite3数据库_树莓派使用 Python + SQLite 建立温度数据库
- c语言中欧几里得模乘法逆元,扩展欧几里得算法同余方程模m乘法逆元详解
- linux安装trac+svn+apache+wike,apache+svn+trac安装及配置2
- 今天实现了一个功能就是,树结点的拖动
- 【服务器】【个人网盘】宝塔安装NextCloud
- java文件读取路径_java文件读取路径问与答
- Jmeter 面试题
- 学好算法,真的需要智商吗?
- 835616-60-9,4-Fluoro-thalidomide用于补充CRBN蛋白的沙利度胺基脑啡肽配体
热门文章
- android 手机开门,别羡慕安卓手机能开门!苹果手机也能用作门禁卡,回家一碰就开门...
- 图片水中倒影 【js读书笔记】
- 利用perf及FlameGraph生成火焰图
- 菜鸟ACM职业生涯模板总结
- java音乐剪辑代码(只能剪辑从开始到最后的部分,也可以中间截取,加个计数器就行了)
- 语录分享 ——许逊真君《警世格言》
- android 9坚果r1,「旗舰」坚果R1开箱,红蓝荧光照亮细细的红线
- 俄罗斯文学一瞥——鲁迅《穷人》小引
- CSDN:《新程序员003》正式上市,华为、阿里等 30+ 公司的云原生及数字化实战经验
- 用python进行yahoo股票数据分析(tushare接口数据)