动态规划——B 最大高度问题

B - LIS

Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

Submit Status

Description

一组研究人员正在设计一项实验,以测试猴子的智商。他们将挂香蕉在建筑物的屋顶,同时,提供一些砖块给这些猴子。如果猴子足够聪明,它应当能够通过合理的放置一些砖块建立一个塔,并爬上去吃他们最喜欢的香蕉。

研究人员有n种类型的砖块,每种类型的砖块都有无限个。第i块砖块的长宽高分别用xi,yi,zi来表示。 同时,由于砖块是可以旋转的,每个砖块的3条边可以组成6种不同的长宽高。

在构建塔时,当且仅当A砖块的长和宽都分别小于B砖块的长和宽时,A砖块才能放到B砖块的上面,因为必须留有一些空间让猴子来踩。

你的任务是编写一个程序,计算猴子们最高可以堆出的砖块们的高度。

Input

输入文件包含多组测试数据。

每个测试用例的第一行包含一个整数n,代表不同种类的砖块数目。n<=30.

接下来n行,每行3个数,分别表示砖块的长宽高。

当n= 0的时候,无需输出任何答案,测试结束。

Output

对于每组测试数据,输出最大高度。格式:Case 第几组数据: maximum height = 最大高度

Sample Input

1

10 20 30 

6 8 10 
5 5 5 

1 1 1 
2 2 2 
3 3 3 
4 4 4 
5 5 5 
6 6 6 
7 7 7 

31 41 59 
26 53 58 
97 93 23 
84 62 64 
33 83 27 
0

Sample Output

Case 1: maximum height = 40

Case 2: maximum height = 21 
Case 3: maximum height = 28 
Case 4: maximum height = 342

解题思路:

这个问题需要用到DAG路径模型,与紫书上的262页的嵌套矩形问题一样,这里需要注意的是,最好将三种情况都放到结构体数组X[]中存储好,然后对其降序排序,

最后再进行DAG路经模型算法

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
struct node
{
    int a,b,c;
}x[200];
bool cmp(node p,node q)
{
    return p.a<q.a||(q.a==p.a&&p.b<q.b);
}
long long int dp[210],w;
int n,k;
void init()
{
    int y[3];
    k=0;
    for(int i=0;i<n;i++)
        {
            scanf("%d%d%d",&y[0],&y[1],&y[2]);
            sort(y,y+3);
            x[k].a=y[0];x[k].b=y[1];x[k].c=y[2];k++;
            x[k].a=y[1];x[k].b=y[2];x[k].c=y[0];k++;
            x[k].a=y[0];x[k].b=y[2];x[k].c=y[1];k++;
        }
}
void work()
{
     sort(x,x+k,cmp);
     for(int i=0;i<k;i++)
       dp[i]=x[i].c;
     w=0;
    for(int i=1;i<k;i++)
    {
        int mx=0;
        for(int j=i-1;j>=0;j--)
            if((x[i].a>x[j].a&&x[i].b>x[j].b)&&mx<dp[j])
            mx=dp[j];
        dp[i]+=mx;
        w=max(w,dp[i]);
    }
}
int main()
{
    int Case=0;
    while(scanf("%d",&n)==1&&n)
    {
        init();
        work();
        printf("Case %d: maximum height = %d\n",++Case,w);
    }
    return 0;
}

时间: 2024-12-17 08:10:00

动态规划——B 最大高度问题的相关文章

UVA437-The Tower of Babylon(动态规划基础)

Problem UVA437-The Tower of Babylon Accept: 3648  Submit: 12532Time Limit: 3000 mSec Problem Description Perhaps you have heard of the legend of the Tower of Babylon. Nowadays many details of this tale have been forgotten. So now, in line with the ed

算法整理之动态规划

我现在介绍的这个版本,是从算法爱好者中看到的一个别人的漫画版本.题目:有一座高度是10级台阶的楼梯,从下往上走,每跨一步只能向上1级或者2级台阶.要求用程序来求出一共有多少种走法.比如,每次走1级台阶,一共走10步,这是其中一种走法.我们可以简写成 1,1,1,1,1,1,1,1,1,1.再比如,每次走2级台阶,一共走5步,这是另一种走法.我们可以简写成 2,2,2,2,2. 分析:这种问题是典型的使用动态规划解决的问题,在使用动态规划的方法之前,能想到的方法可能就是使用排列组合,这是一个非常复

HDU 4001 To Miss Our Children Time (动态规划)

To Miss Our Children Time Problem Description Do you remember our children time? When we are children, we are interesting in almost everything around ourselves. A little thing or a simple game will brings us lots of happy time! LLL is a nostalgic boy

LeetCode -- Triangle 路径求最小和( 动态规划问题)

人们常说"细节决定成败". 编码工作中,同样需要关注细节. 本文将给出3个小实例来说明编码中关注细节的重要性,同时给出作者对如何注意编码细节的一点见解(说的不对,请指正). 例1 这个问题如此地显而易见,竟然没有被发现. List<int> numList = new List<int>(); numList.Add(3); numList.Add(1); numList.Add(4); numList.Add(2); numList.Add(5); numLi

2017清北学堂集训笔记——动态规划Part2

啊~到下午啦,我们进入Part2!--一个简洁的开头 我们来探讨第一类问题--路径行走问题 经典例题:方格取数(Luogu 1004) 设有 N*N 的方格图 (N<=9),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字 0.* 某人从图的左上角的 A 点出发,可以向下行走,也可以向右走,直到到达右下角的 B 点.在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字 0).* 此人从 A 点到 B 点共走两次,试找出 2 条这样的路径,使得取得的数之和为最大.- 与数字金字塔

动态规划程序设计(5)

[例]求最长不下降序列 [问题描述]: 设有由n个不相同的整数组成的数列,记为:b(1).b(2).--.b(n)且b(i)<>b(j)  (i<>j),若存在i1<i2<i3< - < ie 且有b(i1)<b(i2)< - <b(ie)则称为长度为e的不下降序列.程序要求,当原数列给出之后,求出最长的不下降序列. 例如13,7,9,16,38,24,37,18,44,19,21,22,63,15.例中13,16,18,19,21,22,

动态规划之最长公共子串

一 问题引入 在生物学中,经常需要比较两个不同生物的DNA,一个DNA串由由一串称为碱基的的分子组成,碱基有鸟嘌呤,腺嘌呤,胞嘧啶,胸腺嘧啶四中,我们用英文字母的首字母表示四种碱基,那么DNA就是在有限集{A,C,G,T}上的一个字符串.例如某种生物的DNA序列为:S1=ACCGGTCGAGTGCGCGGAAGCCGGCCGAA,S2=GTCGTTCGGAATGCCGTTGCTCTGTAAA,我们比较两个DNA串的原因就是希望确定他们的相似度,作为衡量两个物种相似度的标准.如果一个串是另外一个串

【动态规划】Vijos P1011 清帝之惑之顺治

题目链接: https://vijos.org/p/1011 题目大意: 给一张N*M的地图(N,M<=500),可从任一点开始沿上下左右走,只能走比当前低的地方.问最长能走多少格. 题目思路: [动态规划] 这题就是滑雪,动态规划. 将高度排序后从低往高算,当前高度所在的格子上下左右比当前高度低就可以用来更新答案. 1 // 2 //by coolxxx 3 // 4 #include<iostream> 5 #include<algorithm> 6 #include&l

拦截导弹(动态规划)

拦截导弹 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 某国为了防御敌国的导弹袭击,发展中一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意 的高度,但是以后每一发炮弹都不能高于等于前一发的高度.某天,雷达捕捉到敌国导弹来袭.由于该系统还在试用阶段,所以只用一套系统,因此有可能不能拦截 所有的导弹. 输入 第一行输入测试数据组数N(1<=N<=10) 接下来一行输入这组测试数据共有多少个导弹m(1<=m<=20) 接下来