ZOJ 1093

排序DP(相当于最长不下降子序列)

如果把一块砖块的所有6种摆放方式转化为6种不同的砖块;

即相当于有6n种砖块,然后按照一个方向从大到小排序;

再依次检查每一块与其下面的所有砖块是否满足摆放条件;

将每一块砖块放到塔中能够获得的最大高度记录到数组height[N]中;

则该数组中的最大值就是该题的解了;

#include <iostream>
#include <algorithm>
#include "cstdio"
using namespace std;
#define maxi 200
struct Block{
    int x,y,h;
    void init(int xx,int yy,int hh){
        x=xx;
        y=yy;
        h=hh;
    }
}b[maxi];
int dp[maxi];
int cmp(Block a,Block c)
{
    return a.x>c.x;
}
int max(int a,int c){
    return a>c?a:c;
}
int main(){
    int n,x,y,h,m,game=0;
    freopen("test.txt","r",stdin);
    while(cin>>n){
        if(n==0)break;
        m=0;
        for(int i=0;i<n;i++){
            cin>>x>>y>>h;
            b[m++].init(x,y,h);
            b[m++].init(h,x,y);
            b[m++].init(y,h,x);
            b[m++].init(y,x,h);
            b[m++].init(x,h,y);
            b[m++].init(h,y,x);
        }
        sort(b,b+6*n,cmp);
        for(int i=0;i<n*6;i++){
            dp[i]=b[i].h;
        }
        int ma=0;
        for(int i=1;i<n*6;i++){
            int ans=0;
            for(int j=i-1;j>=0;j--){
                if(b[i].x<b[j].x&&b[i].y<b[j].y&&ans<dp[j])
                    ans=dp[j];
            }
            dp[i]+=ans;
            if(ma<dp[i])ma=dp[i];
        }
        cout<<"Case "<<++game<<": maximum height = "<<ma<<"\n";
    }
    return 0;
}

ZOJ 1093

时间: 2024-10-10 08:37:02

ZOJ 1093的相关文章

ZOJ 1093 &amp;&amp; NYoj16(DP)

~~~~ 两个题目大致类似,NYOJ上面那道题就是小白上的矩形嵌套啦. 都是先对长宽进行排序,然后逐层更新最大值(边更新边记录). 好了,不说了. 题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1093 http://acm.nyist.net/JudgeOnline/problem.php?pid=16 ~~~~ ZOJ1093: #include<cstdio> #include<cstring&

5thweek.problem_B(zoj 1093) LIS

Description 一组研究人员正在设计一项实验,以测试猴子的智商.他们将挂香蕉在建筑物的屋顶,同时,提供一些砖块给这些猴子.如果猴子足够聪明,它应当能够通过合理的放置一些砖块建立一个塔,并爬上去吃他们最喜欢的香蕉. 研究人员有n种类型的砖块,每种类型的砖块都有无限个.第i块砖块的长宽高分别用xi,yi,zi来表示. 同时,由于砖块是可以旋转的,每个砖块的3条边可以组成6种不同的长宽高. 在构建塔时,当且仅当A砖块的长和宽都分别小于B砖块的长和宽时,A砖块才能放到B砖块的上面,因为必须留有一

ZOJ 1093 Monkey and Banana

题目链接 题意:给你n个规格的砖块,告诉你它的长.宽.高,每种规格的砖都有无数块,长宽小的砖块(严格小于,不能等于)可以叠在长宽大的砖块上,问你最多能叠多高. 思路:告诉你一种规格的砖其实给了你三种规格的砖,因为砖是可以翻转的,长宽高可以变化的: 以长为第一变量,宽为第二变量,从大到小排序,这样垫在第n块砖下面的只能从前n-1块选择,选择最大值,累加高度即可. 代码如下: #include <stdio.h> #include <string.h> #include <ios

ZOJ1093 Monkey and Banana 【DP】

一.题目 ZOJ 1093 二.题目源程序 #include <stdio.h>//一个箱子有3种h..所以总共有3*n种高度.按面积从大到小排序 #include <stdlib.h> struct block { int x,y,z,h; }a[200]; int cmp(const void *a,const void *b)//快排,模版 { return ((struct block *)b)->x*((struct block *)b)->y - ((str

poj - 1093 - Formatting Text(dp)

题意:输入一段短文(所有字符总数不超过10000),要求格式化成两端对齐(每行长度为n,1 <= n <= 80)的方式输出并使得总坏值最小(一个空隙的坏值是这个空隙的空格总数减1后的平方),若有多种方案输出空格数字典序最小方案. 题目链接:http://poj.org/problem?id=1093 -->>状态:dp[i]表示从第i个单词开始到最后一个单词的最小总坏值(第i个单词是这一行的第1个单词) 状态转移方程:dp[i] = min(dp[i], dp[j + 1] +

zoj题目分类

饮水思源---zoj 转载自:http://bbs.sjtu.edu.cn/bbscon,board,ACMICPC,file,M.1084159773.A.html 注:所有不是太难的题都被归成了“简单题”,等到发现的时候已经太晚了,我太死脑筋 了……:( 有些题的程序我找不到了,555……:( SRbGa的题虽然都很经典……但是由于其中的大部分都是我看了oibh上的解题报告后做 的,所以就不写了…… 题目排列顺序没有规律……:( 按照个人感觉,最短路有的算做了DP,有的算做了图论. 有些比较

不允许在子查询的同时删除原表数据(ERROR 1093 (HY000))

delete from t where userid in (select userid from t where userid < 10); ERROR 1093 (HY000): You can't specify target table 't' for update in FROM clause delete from t where userid in (select userid from (select userid from t where userid < 10) tmp )

概率dp ZOJ 3640

Help Me Escape Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu Submit Status Practice ZOJ 3640 Appoint description:  System Crawler  (2014-10-22) Description Background     If thou doest well, shalt thou not be accepted? an

zoj 2156 - Charlie&#39;s Change

题目:钱数拼凑,面值为1,5,10,25,求组成n面值的最大钱币数. 分析:dp,01背包.需要进行二进制拆分,否则TLE,利用数组记录每种硬币的个数,方便更新. 写了一个 多重背包的 O(NV)反而没有拆分快.囧,最后利用了状态压缩优化 90ms: 把 1 cents 的最后处理,其他都除以5,状态就少了5倍了. 说明:貌似我的比大黄的快.(2011-09-26 12:49). #include <stdio.h> #include <stdlib.h> #include <