【题目链接】:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=378

【题意】



给你n个方形;

由3个属性,长宽高决定;

你可以任意摆放这个方形(即把哪一面朝下方);

然后每种方形都有无限个;

一个方形能够摆在另外一个方形上面,当且仅当这个方形的长和宽都严格大于另外一个方形的长和宽(即changi>changj && kuani>kuanj);

问你这n个方形最多能叠多高;

【题解】



把每个方形的3种摆法都取出来;

(即取3个属性中的某一个属性出来作为高,另外两个作为宽和长);

然后如果某一个方形x可以放到另外一个方形y的上面;

则连一条有向边x指向y;

然后问题就能转化为一个有向无环图上的最长路了;

起点不一定

也即一条最长链

写个记忆化搜索就好;

f[x]=max(f[x],f[y]+h[x]),(x,y)∈E,h[x]为x的高



【Number Of WA】



1



【反思】



忘记初始化+忘记输出Case



【完整代码】

#include <bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define ms(x,y) memset(x,y,sizeof x)
#define Open() freopen("D:\\rush.txt","r",stdin)
#define Close() ios::sync_with_stdio(0) typedef pair<int,int> pii;
typedef pair<LL,LL> pll; const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
const double pi = acos(-1.0);
const int N = 30; struct abc{
LL c,k,g;
}; int n,b[4],nn;
LL dp[N*3+100];
abc a[N*3+100];
vector <int> G[N*3+100]; LL dfs(int x){
if (dp[x]!=-1) return dp[x];
LL &ans = dp[x];
ans = a[x].g;
int len = G[x].size();
rep1(i,0,len-1){
int y = G[x][i];
ans = max(ans,dfs(y) + a[x].g);
}
return dp[x];
} int main()
{
//Open();
int kk = 0;
while (~scanf("%d",&n) && n){
kk++;
ms(dp,-1);
nn = 0;
rep1(i,1,N*3) G[i].clear();
rep1(i,1,n){
rep1(j,1,3)
scanf("%d",&b[j]);
sort(b+1,b+1+3);
rep1(j,1,3){
nn++;
rep2(k,3,1)
if (k!=j){
a[nn].c = b[k];
break;
}
rep1(k,1,3)
if (k!=j){
a[nn].k = b[k];
break;
}
a[nn].g = b[j];
}
}
n = nn;
rep1(i,1,n)
rep1(j,1,n)
if (a[i].c > a[j].c && a[i].k > a[j].k)
G[i].pb(j);
LL d = 0;
rep1(i,1,n)
d = max(d,dfs(i));
printf("Case %d: maximum height = ",kk);
printf("%lld\n",d);
}
return 0;
}

【UVA 437】The Tower of Babylon(记忆化搜索写法)的更多相关文章

  1. poj1179 区间dp(记忆化搜索写法)有巨坑!

    http://poj.org/problem?id=1179 Description Polygon is a game for one player that starts on a polygon ...

  2. UVA 10003 Cutting Sticks 区间DP+记忆化搜索

    UVA 10003 Cutting Sticks+区间DP 纵有疾风起 题目大意 有一个长为L的木棍,木棍中间有n个切点.每次切割的费用为当前木棍的长度.求切割木棍的最小费用 输入输出 第一行是木棍的 ...

  3. UVA 10400 Game Show Math (dfs + 记忆化搜索)

    Problem H Game Show Math Input: standard input Output: standard output Time Limit: 15 seconds A game ...

  4. UVA 11884 A Shooting Game(记忆化搜索)

    A and B are playing a shooting game on a battlefield consisting of square-shaped unit blocks. The bl ...

  5. hdu 2089 记忆化搜索写法(数位dp)

    /* 记忆化搜索,第二维判断是否是6 */ #include<stdio.h> #include<string.h> #define N 9 int dp[N][2],digi ...

  6. UVa 437 The Tower of Babylon

    Description   Perhaps you have heard of the legend of the Tower of Babylon. Nowadays many details of ...

  7. UVa 437 The Tower of Babylon(经典动态规划)

    传送门 Description Perhaps you have heard of the legend of the Tower of Babylon. Nowadays many details ...

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

     题意  给你n种长方体  每种都有无穷个  当一个长方体的长和宽都小于还有一个时  这个长方体能够放在还有一个上面  要求输出这样累积起来的最大高度 由于每一个长方体都有3种放法  比較不好控制 ...

  9. UVA - 437 The Tower of Babylon(dp-最长递增子序列)

    每一个长方形都有六种放置形态,其实可以是三种,但是判断有点麻烦直接用六种了,然后按照底面积给这些形态排序,排序后就完全变成了LIS的问题.代码如下: #include<iostream> ...

随机推荐

  1. 关于jsp web项目,jsp页面与servlet数据不同步的解决办法(报错404、405等)即访问.jsp和访问web.xml中注册的/servlet/的区别

    报错信息: Type Status Report Message HTTP method GET is not supported by this URL Description The method ...

  2. Vue.js Ajax动态参数与列表显示

    一.动态参数显示 1.引入js <script type="text/javascript" src="/js/vue.min.js"></s ...

  3. 「JavaSE 重新出发」02.02 引用数据类型

    引用(复合)数据类型 1. 枚举类型 例: 枚举类型 Size 的声明: enum Size { SMALL, MEDIUM, LARGE, EXTRA_LARGE }; 声明 Size 类型变量: ...

  4. HDU 1892 See you~ 【 二维树状数组 】

    题意:二维的树状数组注意的有三个地方,输入进去的坐标都加1,防止lowbit(0) + 0造成死循环还有就是询问矩形面积的时候,输入进去的x1,x2,y1,y2,可能不是正对角线,要转化成正对角线 初 ...

  5. php时间差方法

    /** * 时间差计算 * * @param Timestamp $time * @return String Time Elapsed */ function time2Units ($time,$ ...

  6. 函数式编程-只用"表达式",不用"语句"()

    把函数当作普通的运算符使用. 2. 只用"表达式",不用"语句"() "表达式"(expression)是一个单纯的运算过程,总是有返回值: ...

  7. IPv6理论知识详解

    1. IPv6地址表示 IPv6地址可以表示为128位由0.1组成的字符串,为了便于计算机理解,将128位的二进制字符串表示为32位的十六进制字符串,为了便于理解,人们将其划分为8组,组与组之间用 : ...

  8. [CTSC1999]家园 分层图网络流_并查集

    Code: #include<cstdio> #include<vector> #include<algorithm> #include<queue> ...

  9. 2013-11-02 【webrebuild广州站】分享会纪要

    为了不让自己沉浸个人的技术研究当中,也为了多去接触业界新技术新思想,今天去参加了webrebuild广州站的一个分享交流会,效果不错,有一些获益.听了四个主题,依据个人获取信息的情况来做个纪要(比较粗 ...

  10. 微信小程序微信支付的一些坑

    使用的是Node.js作为后端 统一下单: appid:这里的appid是调起微信支付的appid mch_id:商户号,需要注意的是商户号要与appid对应 nonce_str:Math.rando ...