UVA 437_The Tower of Babylon
题意:
一堆石头,给定长宽高,每种石头均可以使用无数次,问这堆石头可以叠放的最高高度,要求下面的石头的长和宽分别严格大于上面石头的长和宽。
分析:
采用DAG最长路算法,由于长宽较大,不能直接用于表示状态,因此采用d[i][x]表示以第i块石头为最高点,以其第x个边为高所能达到的最大高度,其中i为石头标号,x代表长/宽/高,然后根据长宽高要求构造DAG,最后记忆化搜索求出最长路。
代码:
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int maxn = 0, ans = 0, n;
int y[35][4];
int G[35][4][35][4];
const int INF = 0x3fffffff;
int a[2],b[2], d[35][4];
int getDAG(int i, int k, int j, int m)
{
if(k==1) a[0] = y[i][2], a[1] = y[i][3];
else if(k==2) a[0] = y[i][3], a[1] = y[i][1];
else a[0] = y[i][2], a[1] = y[i][1];
if(m==1) b[0] = y[j][2], b[1] = y[j][3];
else if(m==2) b[0] = y[j][3], b[1] = y[j][1];
else b[0] = y[j][2], b[1] = y[j][1];
sort(a,a+2);
sort(b,b+2);
return (a[0]>b[0]&&a[1]>b[1])?1:0;
}
int dp(int i, int k)
{
int& ans = d[i][k];
if(ans > 0) return ans;
for(int j = 0; j < n; j++){
for(int m = 1; m <= 3; m++){
if(getDAG(j,m,i,k)) ans = max(ans, dp(j, m));
}
}
ans += y[i][k];
return ans;
}
int main (void)
{
int a, b, c;
cin>>n;
int cnt = 1;
while(n){
maxn = 0;
memset(d,0,sizeof(d));
memset(G,0,sizeof(G));
for(int i = 0; i < n; i++){
cin>>a>>b>>c;
y[i][1] = a; y[i][2] = b; y[i][3] = c;
}
for(int i = 0; i < n; i++)
for(int k = 1; k <= 3; k++)
for(int j = 0; j < n; j++)
for(int m = 1; m <= 3; m++)
getDAG(i,k,j,m);
for(int i = 0; i < n; i++)
for(int k = 1; k <= 3; k++)
maxn = max(maxn,dp(i, k));
cout<<"Case "<<cnt<<": maximum height = "<<maxn<<endl;
cin>>n;
cnt++;
}
}
很白痴的细节问题纠结了一下午,还是要细心!细心!
UVA 437_The Tower of Babylon的更多相关文章
- uva The Tower of Babylon[LIS][dp]
转自:https://mp.weixin.qq.com/s/oZVj8lxJH6ZqL4sGCXuxMw The Tower of Babylon(巴比伦塔) Perhaps you have hea ...
- UVA The Tower of Babylon
The Tower of Babylon Perhaps you have heard of the legend of the Tower of Babylon. Nowadays many det ...
- UVA 437 十九 The Tower of Babylon
The Tower of Babylon Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Subm ...
- 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
Description Perhaps you have heard of the legend of the Tower of Babylon. Nowadays many details of ...
- UVa 437 The Tower of Babylon(DP 最长条件子序列)
题意 给你n种长方体 每种都有无穷个 当一个长方体的长和宽都小于还有一个时 这个长方体能够放在还有一个上面 要求输出这样累积起来的最大高度 由于每一个长方体都有3种放法 比較不好控制 ...
- POJ2241——The Tower of Babylon
The Tower of Babylon Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 2207 Accepted: 1 ...
- UVA437-The Tower of Babylon(动态规划基础)
Problem UVA437-The Tower of Babylon Accept: 3648 Submit: 12532Time Limit: 3000 mSec Problem Descrip ...
- DAG 动态规划 巴比伦塔 B - The Tower of Babylon
题目:The Tower of Babylon 这是一个DAG 模型,有两种常规解法 1.记忆化搜索, 写函数,去查找上一个符合的值,不断递归 2.递推法 方法一:记忆化搜索 #include < ...
随机推荐
- Farseer.net轻量级ORM开源框架 V1.x 入门篇:数据库配置文件
导航 目 录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:新版本说明 下一篇:Farseer.net轻量级ORM开源框架 ...
- Java入门第39课——猜字母游戏之实现字母生成方法
问题 实现猜字母游戏中的字母生成方法,即,随机生成5个不同的字母作为猜测的结果. 方案 实现generate方法,首先声明一个字符类型的数组,用于存储26个大写字母,然后声 ...
- PHP-碎片知识 $_SERVER['argv']
1.cli模式(命令行)下,第一个参数$_SERVER['argv'][0]是脚本名,其余的是传递给脚本的参数 2.web网页模式下 在web页模式下必须在php.ini开启register_argc ...
- C# Word 类库
C# Word 类库 2009-08-06 22:10 14292人阅读 评论(11) 收藏 举报 c#objectstring文档microsoftexcel using System;using ...
- java was started but returned exit code =-805306369的处理方法
Myeclipse出现java was started but returned exit code =-805306369的错误,如图: 解决方法: 换个workspaces:换个工作目录,估计估计 ...
- torch.nn.Linear()函数的理解
import torch x = torch.randn(128, 20) # 输入的维度是(128,20)m = torch.nn.Linear(20, 30) # 20,30是指维度output ...
- 一键分享到QQ空间、QQ好友、新浪微博、微信代码
通过qq空间.qq聊天.新浪微博和微信二维码分享平台提供的接口,实现把网页中对应的图片.标题.描述的信息参数用javascript获取后传进接口中,实现一键分享. 使用到的接口(测试时需要登录,网址和 ...
- jenkins构建项目记录2(tag)
与jenkins构建项目记录1不同的是通过tag拉去对应版本代码 1.先安装创建(git parameter) 2.general设置 name可任意命名,下面源码管理设置时变量会引用到. 3.源码管 ...
- Yii 2.0版本调试输出SQL语句
项目是基于框架Yii 2.0开发的. 今天梳理一些数据统计功能代码的时候,想把当前运行的sql语句打印出来,然后放到navicat工具里面运行,并分析一下运行效率和调优方案,之前大部分时候都是写增加. ...
- js ajax 传送xml dom对象到服务器
客户端代码 1 <script> var isie = true; var xmlhttp = null; function createXMLHTTP() {//创建XMLXMLHttp ...