【UVA 437】The Tower of Babylon(记忆化搜索写法)
【题目链接】: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(记忆化搜索写法)的更多相关文章
- poj1179 区间dp(记忆化搜索写法)有巨坑!
http://poj.org/problem?id=1179 Description Polygon is a game for one player that starts on a polygon ...
- UVA 10003 Cutting Sticks 区间DP+记忆化搜索
UVA 10003 Cutting Sticks+区间DP 纵有疾风起 题目大意 有一个长为L的木棍,木棍中间有n个切点.每次切割的费用为当前木棍的长度.求切割木棍的最小费用 输入输出 第一行是木棍的 ...
- UVA 10400 Game Show Math (dfs + 记忆化搜索)
Problem H Game Show Math Input: standard input Output: standard output Time Limit: 15 seconds A game ...
- UVA 11884 A Shooting Game(记忆化搜索)
A and B are playing a shooting game on a battlefield consisting of square-shaped unit blocks. The bl ...
- hdu 2089 记忆化搜索写法(数位dp)
/* 记忆化搜索,第二维判断是否是6 */ #include<stdio.h> #include<string.h> #define N 9 int dp[N][2],digi ...
- UVa 437 The Tower of Babylon
Description Perhaps you have heard of the legend of the Tower of Babylon. Nowadays many details of ...
- UVa 437 The Tower of Babylon(经典动态规划)
传送门 Description Perhaps you have heard of the legend of the Tower of Babylon. Nowadays many details ...
- UVa 437 The Tower of Babylon(DP 最长条件子序列)
题意 给你n种长方体 每种都有无穷个 当一个长方体的长和宽都小于还有一个时 这个长方体能够放在还有一个上面 要求输出这样累积起来的最大高度 由于每一个长方体都有3种放法 比較不好控制 ...
- UVA - 437 The Tower of Babylon(dp-最长递增子序列)
每一个长方形都有六种放置形态,其实可以是三种,但是判断有点麻烦直接用六种了,然后按照底面积给这些形态排序,排序后就完全变成了LIS的问题.代码如下: #include<iostream> ...
随机推荐
- (转载)Android之三种网络请求解析数据(最佳案例)
[置顶] Android之三种网络请求解析数据(最佳案例) 2016-07-25 18:02 4725人阅读 评论(0) 收藏 举报 分类: Gson.Gson解析(1) 版权声明:本文为博主原创 ...
- 集合类 ArrayList实现公司职员薪水管理
package com.test; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStr ...
- EFcore笔记之创建模型
排除属性:NotMapped NotMapped:排除属性在CodeFirst的时候在数据库里不创建该属性 public class Blog { public int BlogId { get; ...
- 洛谷P2766 最长不下降子序列问题 网络流_DP
Code: #include<cstdio> #include<iostream> #include<vector> #include<algorithm&g ...
- 1044 - Access denied for user 'root'@'%' to database 'xahy-blog' 解决方案二
检查 user 表中'root'@'%' 的grant的权限 select HOST,USER,Grant_priv,Super_priv from mysql.`user`; 可以看到现在这两个权限 ...
- 原生ajax实现文件上传
视图层 JS 函数: <input type="file" onchange="sendFile()" id="up" /> ...
- 字符串的格式化(转自武sir)
百分号s方式: (name) 可选,用于选择指定的key flags 可选,可供选择的值有: + 右对齐:正数前加正好,负数前加负号: - 左对齐 ...
- js递归获取html页面所有标签
js原生递归获取,直接源码 : <script> var child = document.children; var arr = [];//用来存放获取到的所有的标签 function ...
- shell 特殊字符
shell 基础 # 当做注释的比较多 : 命令分隔符,在同一行上写两个或两个以上的命令 :: 是case 代码块的结束符 . 点作为文件名的一部分 隐藏文件 目录名 点是正则表达式中的匹配字符 '' ...
- vue非父子组件间传参问题
最近在使用vue进行开发,遇到了组件之间传参的问题,此处主要是针对非父子组件之间的传参问题进行总结,方法如下:一.如果两个组件用友共同的父组件,即 FatherComponent.vue代码 < ...