uva--437The Tower of Babylon+dp

题意:

给定一些立方体,对于两个立方体,只有其中一个底面两个边都严格小于另一个才可以放在其上面。求可以得到的最大高度。

思路:

一个立方体可以转成6个底面不同的具有不同权值(高度)的矩形,然后就是这些矩形的嵌套问题了。以前是将这个问题转成了DAG图上的最长路做的;这一次直接将这些矩形按照底面积由小到大的排序,然后问题就变成求最长上升子序列了。

代码如下:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;

int k;

typedef struct
{
    int x,y,z;
}S;
S st[200];

int cmp(S s1,S s2)
{
    return s1.x*s1.y>s2.x*s2.y;
}

int main()
{
    int n,Case=0;
    while(scanf("%d",&n)&&n)
    {
        k=1;
        for(int i=0;i<n;i++)
        {
            int x,y,z;
            scanf("%d%d%d",&x,&y,&z);
            st[k].x=x; st[k].y=y; st[k].z=z;
            k++;
            st[k].x=y; st[k].y=x; st[k].z=z;
            k++;
            st[k].x=z; st[k].y=x; st[k].z=y;
            k++;
            st[k].x=x; st[k].y=z; st[k].z=y;
            k++;
            st[k].x=z; st[k].y=y; st[k].z=x;
            k++;
            st[k].x=y; st[k].y=z; st[k].z=x;
            k++;
        }
        sort(st+1,st+k,cmp);
        int dp[200],ans=0;
        for(int i=1;i<k;i++)
            dp[i]=st[i].z;
        for(int i=1;i<k;i++)
            for(int j=1;j<i;j++)
            {
                if(st[i].x<st[j].x&&st[i].y<st[j].y)
                {
                     dp[i]=max(dp[i],dp[j]+st[i].z);
                     ans=max(ans,dp[i]);
                }
            }
        printf("Case %d: maximum height = %d\n",++Case,ans);
    }
  return 0;
}
时间: 2024-10-29 14:19:29

uva--437The Tower of Babylon+dp的相关文章

Uva 437-The Tower of Babylon(DP)

题目链接:点击打开链接 DAG上最长路. 题意:给出n种长方体,(每种无限),要求能摞的最大高度.连边是大的连小的. #include <algorithm> #include <iostream> #include <cstring> #include <cstdlib> #include <string> #include <cctype> #include <vector> #include <cstdio&g

UVA 437 The Tower of Babylon DP

有向图DAG The Tower of Babylon Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Submit Status Description Perhaps you have heard of the legend of the Tower of Babylon. Nowadays many details of this tale have been forgotten. So n

UVa 437 The Tower of Babylon(DP 最长条件子序列)

 题意  给你n种长方体  每种都有无穷个  当一个长方体的长和宽都小于另一个时  这个长方体可以放在另一个上面  要求输出这样累积起来的最大高度 因为每个长方体都有3种放法  比较不好控制   可以把一个长宽高分成三个长方体  高度是固定的  这样就比较好控制了 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define maxn 105 int x[max

UVA The Tower of Babylon

The Tower of Babylon 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 educational nature of this contest, we will tell you the whole story: The babylonians

uva437 poj2241 The Tower of Babylon dp

// 这题开始在算法竞赛入门经典的书上状态表示 // dp[i][j]表示前i个方块以第j条边为高所能得到的最大高度值 // dp[i][j] = max(dp[0...i-1][0,1,2]+block[i][j]); // 就是一个DAG模型 // 这样记忆化搜索就行啦,还是有些技巧的 // // 第二种做法就是递推 // 首先把一个方块变为6个,即表示长,宽,高 // 当然,首先得要把底面积从大到小排序 // dp[i]表示前i种方块所能达到的最大高度 // dp[i] = max(dp[

UVa 10051 Tower of Cubes(DP 最长立体堆叠)

 题意  给你n个立方体  立方体每面都涂有颜色  当一个立方体序号小于另一个立方体且这个立方体底面的颜色等于另一个立方体顶面的颜色  这个立方体就可以放在另一个立方体上面  求这些立方体堆起来的最大高度: 每个立方体有6种放置方式  为了便于控制  个人喜欢将一个立方体分解为6个  这样每个立方体只用考虑顶面和底面   d[i]表示分解后以第i个立方体为基底可以达到的最大高度  j从1到i-1枚举  当满足top[i]==bot[j]时  d[i]=max(d[i],d[j]+1) #in

UVA 10051 --Tower of Cubes +dp

先将立方体按重量从大到小排序,然后就转成了类似于最长上升子序列的问题: 定义状态dp[i][j]表示以第i个立方体的第j面作为顶面时的最大高度. 则dp[i][j]=max(dp[k][d]+1;1<=k<=i-1,m[i][5-j]==m[d][k]) 注意为了方便后面的状态判定,我们在输入的时候要使得相对的面的坐标和为一个常数5. 对于路径输出,我们可以采用记录父节点的方法. 代码如下: #include<iostream> #include<cstring> #i

UVa 10051 Tower of Cubes(DP 最长序列)

Problem A: Tower of Cubes  In this problem you are given N colorful cubes each having a distinct weight. Each face of a cube is colored with one color. Your job is to build a tower using the cubes you have subject to the following restrictions: Never

UVA 437 十九 The Tower of Babylon

The Tower of Babylon Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Practice UVA 437 Appoint description:  System Crawler  (2015-08-29) Description Perhaps you have heard of the legend of the Tower of Babylon. No