【暑假】[深入动态规划]UVa 10618 The Bookcase
UVa 12099 The Bookcase
题目:
http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=42067
思路:
将n本书分配到三层,使得形成的书架w*h最小
提前将书籍按照高度排序,因为无论第一本书(最高的书)无论放在那一层都会被考虑到,所以规定将它放在第一层,且第二层比第三层高。
因为从大到小排序的关系,只要jk==0那么新加入的书i就是该层的高度,否则高度不变。
设d[i][j][k]表示考虑过i本书第二层宽度为j第三层宽度为k时二三层的最小的高度和。
状态转移方程:(->表示更新)
d[i][j][k]->d[i+1][j][k]
d[i][j][k]+f(j,book[i].h)->d[i+1][j+book[i].w][k]
d[i][j][k]+f(k,book[i].h->d[i+1][j][k+book[i].w]
定义f(a,b):当a==0时return b esle return 0; 关于第一层,高度为book[0].h宽度为pre_w[n]-ww2-ww3;
优化:
- 时间:考虑到第i本书时, j+k不超过前i本书的宽度之和,减小jk的枚举范围。
- 时间:书上这样说:如果ww2>ww1+30 那么可以把第2层的一本书放到第1层情况不会更差,所以只需要计算ww2<=ww1+30 且ww3<=ww2+30情况。此时有j<=1065 k<=720。
- 空间:滚动数组,细节不好判断因此同时保留两行,操作行与更新行。
代码:
#include<iostream>
#include<algorithm>
#define FOR(a,b,c) for(int a=(b);a<=(c);a++)
using namespace std; const int maxn = + ;
const int maxw = ;
const int INF = <<; struct Node{
int w,h;
bool operator <(const Node& rhs) const {
return h>rhs.h || (h==rhs.h && w>rhs.w);
}
}book[maxn]; int d[][maxn*maxw][maxn*maxw];
int pre_w[maxn]; int n; inline int f(int j,int h) {
return j==? h:;
}
inline void update(int& x,int v) {
if(x< || v<x) x=v;
} int main() {
ios::sync_with_stdio(false); int T; cin>>T;
while(T--) {
cin>>n;
FOR(i,,n-) cin>>book[i].h>>book[i].w;
sort(book,book+n);
pre_w[]=;
FOR(i,,n) pre_w[i]=pre_w[i-]+book[i-].w; d[][][]=;
int t=;
FOR(i,,n-) {
FOR(j,,pre_w[i+])
FOR(k,,pre_w[i+]-j) d[t^][j][k]=-; FOR(j,,pre_w[i])
FOR(k,,pre_w[i]-j) if(d[t][j][k]>=){
update(d[t^][j][k],d[t][j][k]);
update(d[t^][j+book[i].w][k],d[t][j][k]+f(j,book[i].h));
update(d[t^][j][k+book[i].w],d[t][j][k]+f(k,book[i].h));
}
t^=;
} int ans=INF;
FOR(j,,pre_w[n])
FOR(k,,pre_w[n]-j) if(d[t][j][k]>=){
int w=max(max(j,k),pre_w[n]-j-k);
int h=d[t][j][k]+book[].h;
ans=min(ans,w*h);
}
cout<<ans<<"\n";
}
return ;
}
【暑假】[深入动态规划]UVa 10618 The Bookcase的更多相关文章
- 【暑假】[深入动态规划]UVa 10618 Fun Game
UVa 10618 Fun Game 题目: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=36035 思路: 一圈人围坐 ...
- 【暑假】[深入动态规划]UVa 10618 Fixing the Great Wall
UVa 10618 Fixing the Great Wall 题目: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=361 ...
- 【暑假】[深入动态规划]UVa 10618 Tango Tango Insurrection
UVa 10618 Tango Tango Insurrection 题目: Problem A: Tango Tango Insurrection You are attempting to lea ...
- UVa 12099 The Bookcase - 动态规划
题目大意 给定一些书,每个书有一个高度和宽度,然后将它们放到一个三层的书架里(要求每一层都不为空).定义书架的大小为每层最大的高度和 乘 每层宽度和的最大值.求最小的书架大小. 显然动态规划(直觉,没 ...
- 【暑假】[深入动态规划]UVa 1628 Pizza Delivery
UVa 1628 Pizza Delivery 题目: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=51189 思路: ...
- 【暑假】[深入动态规划]UVa 1380 A Scheduling Problem
UVa 1380 A Scheduling Problem 题目: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=41557 ...
- 【暑假】[深入动态规划]UVa 12170 Easy Climb
UVa 12170 Easy Climb 题目: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=24844 思路: 引别人一 ...
- 【暑假】[深入动态规划]UVa 1627 Team them up!
UVa 1627 Team them up! 题目: Team them up! Time Limit: 3000MS Memory Limit: Unknown 64bit IO Forma ...
- 【暑假】[深入动态规划]UVa 1412 Fund Management
UVa 1412 Fund Management 题目: UVA - 1412 Fund Management Time Limit: 3000MS Memory Limit: Unknown ...
随机推荐
- idea14使用maven创建web工程
参考博客:http://geeksun.iteye.com/blog/2179658 http://www.bubuko.com/infodetail-387387.html ------------ ...
- FaceNet--Google的人脸识别(转)
引入 随着深度学习的出现,CV领域突破很多,甚至掀起了一股CV界的创业浪潮,当次风口浪尖之时,Google岂能缺席.特贡献出FaceNet再次刷新LFW上人脸验证的效果记录. 本文是阅读FaceNet ...
- sqlmap映射继承机制及映射字段顺序与SQL查询字段顺序无关
<typeAlias alias="TblSpPartsinfo" type="com.bn.car.biz.supply.dao.po.PartsInfoPO&q ...
- RASP 完爆 WAF 的5大理由!
Web 应用防火墙(WAF)已经成为常见 Web 应用普遍采用的安全防护工具,即便如此,WAF 提供的保护方案仍旧存在诸多不足,笔者认为称 WAF 为好的安全监控工具更为恰当.幸运的是,应用安全保护技 ...
- C++ 嵌套类使用(二)
C++嵌套类 1. 嵌套类的名字只在外围类可见. 2. 类的私有成员只有类的成员和友元可以访问,因此外围类不可以访问嵌套类的私有成员.嵌套类可以访问外围类的成员(通过对象.指针或者引用). 3 ...
- Tableau
http://tableau.analyticservice.net/desktop.html
- !! UML十四图打油诗记忆法
http://www.cnitpm.com/pm/7458.html UML十四图打油诗记忆法 UML十四图打油诗记忆法 UML它有十四图 包含静态和动态(分类) 类图构件搞对象(类图.构件图.对象图 ...
- MySQL高效分页解决方案集
一,最常见MYSQL最基本的分页方式: select * from content order by id desc limit 0, 10 在中小数据量的情况下,这样的SQL足够用了,唯一需要注意的 ...
- Java版本的在指定目录及子目录下创建指定的文件
和删除指定目录及子目录下名叫“xxx.txt”的所有文件一样,也是使用递归的方式实现的. 代码如下: public class Example826003 { private static FileO ...
- 请问JDBC中IN语句怎么构建
用PreparedStatement 传多参数时,如果参数个数不确定,还想使用?参数避免sql注入,只有一个办法 根据传递的参数个数,拼接sql语句为 SELECT * FROM TABLE_A WH ...