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;

优化: 

  1.   时间:考虑到第i本书时, j+k不超过前i本书的宽度之和,减小jk的枚举范围。
  2. 时间:书上这样说:如果ww2>ww1+30 那么可以把第2层的一本书放到第1层情况不会更差,所以只需要计算ww2<=ww1+30 且ww3<=ww2+30情况。此时有j<=1065 k<=720。
  3. 空间:滚动数组,细节不好判断因此同时保留两行,操作行与更新行。

代码:

 #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的更多相关文章

  1. 【暑假】[深入动态规划]UVa 10618 Fun Game

    UVa 10618 Fun Game 题目: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=36035 思路:   一圈人围坐 ...

  2. 【暑假】[深入动态规划]UVa 10618 Fixing the Great Wall

    UVa 10618 Fixing the Great Wall 题目:  http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=361 ...

  3. 【暑假】[深入动态规划]UVa 10618 Tango Tango Insurrection

    UVa 10618 Tango Tango Insurrection 题目: Problem A: Tango Tango Insurrection You are attempting to lea ...

  4. UVa 12099 The Bookcase - 动态规划

    题目大意 给定一些书,每个书有一个高度和宽度,然后将它们放到一个三层的书架里(要求每一层都不为空).定义书架的大小为每层最大的高度和 乘 每层宽度和的最大值.求最小的书架大小. 显然动态规划(直觉,没 ...

  5. 【暑假】[深入动态规划]UVa 1628 Pizza Delivery

    UVa 1628 Pizza Delivery 题目: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=51189 思路:    ...

  6. 【暑假】[深入动态规划]UVa 1380 A Scheduling Problem

     UVa 1380 A Scheduling Problem 题目: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=41557 ...

  7. 【暑假】[深入动态规划]UVa 12170 Easy Climb

    UVa 12170 Easy Climb 题目: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=24844 思路:  引别人一 ...

  8. 【暑假】[深入动态规划]UVa 1627 Team them up!

    UVa 1627 Team them up! 题目: Team them up! Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Forma ...

  9. 【暑假】[深入动态规划]UVa 1412 Fund Management

    UVa 1412 Fund Management 题目: UVA - 1412 Fund Management Time Limit: 3000MS   Memory Limit: Unknown   ...

随机推荐

  1. flash链接需要后台调用时的插入flash方法

    <!--<textarea id="syslink" style="display:none;">// 1:打宝塔 2:山寨玩法 3:跨服竞技 ...

  2. 【扩展欧几里得】Codevs 1200: [noip2012]同余方程

    Description 求关于 x 同余方程 ax ≡ 1 (mod b)的最小正整数解. Input Description 输入只有一行,包含两个正整数 a, b,用 一个 空格隔开. Outpu ...

  3. BZOJ 3173 [Tjoi2013] 最长上升子序列 解题报告

    这个题感觉比较简单,但却比较容易想残.. 我不会用树状数组求这个原排列,于是我只好用线段树...毕竟 Gromah 果弱马. 我们可以直接依次求出原排列的元素,每次找到最小并且最靠右的那个元素,假设这 ...

  4. Form表单学习网站

    HTML表单 -- form标签 -- 与浏览者交互:http://www.dreamdu.com/xhtml/tag_form/

  5. [转载]介绍一个JSONP 跨域访问代理API-yahooapis

    你是否遇到了想利用AJAX访问一些公网API,但是你又不想建立自己的代理服务,因为有时我根本就没打算涉及服务端任何代码,但是讨厌的浏览器的同源策略,阻止了我们的ajax调用. 比如我想访问一个天气的r ...

  6. 用printf做彩色日志记录

    写了一个简单的程序,但是考虑到有一些信息是需要打印在控制台上的,就像在windows上启动apache tomcat时控制台显示的信息一样.琢磨一会儿之后,对printf进行了封装,支持控制台打印日志 ...

  7. POJ 1797 Heavy Transportation(Dijkstra)

    http://poj.org/problem?id=1797 题意 :给出N个城市M条边,每条边都有容量值,求一条运输路线使城市1到N的运输量最大. 思路 :用dijkstra对松弛条件进行变形.解释 ...

  8. 在线学习SQL语句?没问题~~

    以前弄得少,没注意.. http://sqlfiddle.com/ CREATE TABLE Presidents ( Id INT UNSIGNED NOT NULL AUTO_INCREMENT, ...

  9. git 命令整理

    记录一些git 命令,以便自己以后查阅 基本命令   1.git add (保存工作区的变动到暂存区) git add . 和git add -A把整个工作区添加到暂存区 2.git commit ( ...

  10. iOS开发之loadView、viewDidLoad及viewDidUnload的关系

    iOS开发之loadView.viewDidLoad及viewDidUnload的关系 iOS开发之loadView.viewDidLoad及viewDidUnload的关系    标题中所说的3个方 ...