[Shoi2007]Bookcase 书柜的尺寸 dp
这道dp算是同类型dp中比较难的了,主要难点在于设置状态上;
如果像平时那样设置,必定爆空间没商量;
下面是一种思路:
先把输入进来的数据按h从大到小排序,这样就可以大大减少状态数,
然后设f[i][j][k]为前i本书第一个书柜厚度j,第二个书柜厚度k,第三个书柜厚度sum[i]-j-k的h最大值得最小和;
这样一是将h放在了里面,相当于一个方程思想,因为s可以由h,t算出来;
二是转移的时候,如果j,k或sum[i]-j-k为0,直接加上h,因为前面的h比后面的大,方便了转移;
但我最后也是心惊胆战的交了上去,幸运地A了;
这种题还是做的太少了,加油吧;
自己都不忍直视的代码->
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<ctime>
#include<cstring>
#include<string>
#include<algorithm>
#include<map>
#include<set>
using namespace std;
#define LL long long
const long long inf=1000000000LL;
int n,c=;
struct node{
int h,t;
bool operator<(const node& b)const{return h>b.h;}
}e[];
LL f[][],sum[];
void init(){
scanf("%d",&n);
for(int i=;i<=n;i++){scanf("%d%d",&e[i].h,&e[i].t);c+=e[i].t;}
sort(e+,e+n+);
for(int i=;i<=n;i++)sum[i]=sum[i-]+e[i].t;
}
void work(){
memset(f,,sizeof(f));
f[][]=;
for(int i=;i<=n;i++){
for(int j=c/+;j>=;j--)
for(int k=c/+;k>=;k--){
if(sum[i]-j-k==e[i].t)f[j][k]+=e[i].h;
if(j<e[i].t&&k<e[i].t)continue;
if(j==e[i].t)f[j][k]=min(f[j][k],f[j-e[i].t][k]+e[i].h);
if(j>e[i].t)f[j][k]=min(f[j][k],f[j-e[i].t][k]);
if(k==e[i].t)f[j][k]=min(f[j][k],f[j][k-e[i].t]+e[i].h);
if(k>e[i].t)f[j][k]=min(f[j][k],f[j][k-e[i].t]);
}
}
long long ans=10000000000LL;
for(int j=;j<=c/+;j++)
for(int k=;k<=c/+;k++){
if(c-j-k<=)break;
ans=min(ans,(f[j][k]>=inf?inf:f[j][k])*max(max(j,k),c-j-k));
}
cout<<ans<<endl;
}
int main(){
init();
work();
return ;
}
[Shoi2007]Bookcase 书柜的尺寸 dp的更多相关文章
- BZOJ1933: [Shoi2007]Bookcase 书柜的尺寸
传送门 很容易看出来这是一道DP题,那么怎么设置状态就成了这道题的关键.本题有点特殊的地方是有两个维度的状态,而每个维度又有三个部分的参数,如果全部设置出来的话肯定会MLE.首先对书的厚度状态简化. ...
- BZOJ 1933 [Shoi2007]Bookcase 书柜的尺寸 ——动态规划
状态设计的方法很巧妙,六个值 h1,h2,h3,t1,t2,t3,我们发现t1,t2,t3可以通过前缀和优化掉一维. 然后考虑把h留下还是t留下,如果留下h显然t是会发生改变的,一个int存不下. 如 ...
- BZOJ 1933 [Shoi2007]Bookcase 书柜的尺寸
神奇的dp优化. 考虑6维状态的dp,分别表示三行高和宽,显然MLE&&TLE. 把高排个序,从大到小往架上放,那么若不是重开一行便对高度没有影响. 然后求出宽度的sum,dp[i][ ...
- [SHOI2007] 书柜的尺寸 思维题+Dp+空间优化
Online Judge:Luogu-P2160 Label:思维题,Dp,空间优化 题面: 题目描述 给\(N\)本书,每本书有高度\(Hi\),厚度\(Ti\).要摆在一个三层的书架上. 书架的宽 ...
- 书柜的尺寸(bzoj 1933)
Description Tom不喜欢那种一字长龙式的大书架,他只想要一个小书柜来存放他的系列工具书.Tom打算把书柜放在桌子的后面,这样需要查书的时候就可以不用起身离开了.显然,这种书柜不能太大,To ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- 转 Android:sp与dp(densityDpi与scaledDensity)
一般在布局上设置控件大小维度的单位采用dp,而定义字体大小的单位采用sp. dp是dip,density independent pixel,即密度无关的像素单位,说白了,就是这个维度相对于不同屏幕的 ...
- 土地购买 usaco 斜率优化
看这道题的时候,感觉很难,因为数据范围比较大,很难dp: 后来想到了[书柜的尺寸]这道题,也是一道dp,曾经看了那道题的题解而深有启发: 这道题每组的付费只与这一组长宽的最大值有关,也就是说要分组,一 ...
- Material Design 概念,环境和基本属性
Material Design 概念,环境和基本属性 Material Design是随Android 5.0推出的一种设计概念, 涉及到了跨平台和设备的视觉,动态,交互设计等方面. 设计概念 M ...
随机推荐
- android学习视频分享
最近整理了大量的安卓开发学习资料,有书籍有视频有代码,老罗的第一季有点老了, 这里就给大家分享下老罗的第二季的视频教程吧,还有源码,初级到高级程序猿都有用. 下载地址:http://51pansou. ...
- pjax 历史管理 jQuery.History.js
更新 http://www.bootcdn.cn/jquery.pjax/ 简介 pjax是一个jQuery插件,使用ajax和pushState技术提供快速的浏览体验与真正的永久链接.网页标题.以及 ...
- B-树
定义: B-树是一种平衡的多路查找树,在文件系统中有所应用.主要用作文件的索引. 特性:(M为层数) 1.定义任意非叶子结点最多只有M个儿子:且M>2: 2.根结点的儿子数为[2, M]: 3. ...
- 老外写的在桌面添加快捷方式(DELPHI XE5 ANDROID)
UsesAndroidapi.JNI.GraphicsContentViewText, FMX.Helpers.Android,Androidapi.JNI.JavaTypes, FMX.Platfo ...
- SPARK 数据统计程序性能优化。
昨天写完R脚本 没测试就发到博客里, 结果实际运行发现很慢,运行时间在2小时以上, 查看spark控制台, 大量时间消耗在count上, 产生的stage多大70多个 . 分析原因. 1 selec ...
- Eclipse 4.6 Neon, could not create the java virtual machine
下了eclipse 4.6,打开报错:could not create the java virtual machine. a fatal exception has occurred. 命令行用 e ...
- ASP.NET Core文章汇总
现有Asp.Net Core 文章资料,2016 3-20月汇总如下 ASP.NET Core 1.0 与 .NET Core 1.0 基础概述 http://www.cnblogs.com/Irvi ...
- python中读取配置文件ConfigParser
在程序中使用配置文件来灵活的配置一些参数是一件很常见的事情,配置文件的解析并不复杂,在python里更是如此,在官方发布的库中就包含有做这件事情的库,那就是ConfigParser,这里简单的做一些介 ...
- 《Prism 5.0源码走读》Bootstrapper
Prism框架需要在应用程序启动的时候进行一些初始化的工作,Bootstrapper就是来做这些的,是其切入点. Bootstrapper主要要做的事有:创建和配置module catalog,创建D ...
- 算法:C++排列组合
题目:给定1-n数字,排列组合. 解法:递归.第一个数字有n种选择,第二个数字有n-1种选择,依次递归排列输出.用数组表示n个数字,用过的数字置0. 实现语言:C++ #include <ios ...