传送门

Description

Input

Output

Sample Input

1
10 20 30
2
6 8 10
5 5 5
7
1 1 1
2 2 2
3 3 3
4 4 4
5 5 5
6 6 6
7 7 7
5
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

Hint

  n<=30。

Solution

  一眼看出这是个DAG上的DP,一个信息分成三个方块存储。然后开始读入,拓扑,输出,过样例,提交,WA……

   这里的关键是拓扑序应该怎么求。首先我的比较函数写法如下:

inline bool cmp(const Block &a,const Block &b) {return (a.l1<b.l1&&a.l2<b.l2)||(a.l2<b.l1&&a.l1<b.l2);
}

   然后由于sort的一些问题,这么写会挂掉。hack数据:我丢了……

   然后就来想想这个拓扑怎么求。

   考虑二元组(a,b)表示方块的长和宽,由于长和宽的顺序对放置无影响,所以不妨设a>=b。

   引理:若1能放在2上面,则2不能放在1上面。

    证明:  由题设,a1>a2,b1>b2。

         当2能放在1上面,a2>a1,b2>b1。矛盾。引理得证。

   定理:若a1+b1=a2+b2,则这两个方块不能叠放。

   证明:不妨设a1>=a2。当a1==a2时,b1==b2。又a>b。显然不成立

        当a1>a2,则b1<b2。故不成立。

   定理:当且仅当a1+b1<a2+b2时,方块2可能叠放在1上面。

   证明:已证相等时不成立,现在证明前者大于后者时不成立。

       前者大于后者时,a1+b1>a2+b2。

          当a1<a2,显然b1>b2。不成立。

          当a1>a2,b1>b2,由引理,不成立。

          当a1>a2,b1<b2,显然不成立。

       下面证明可能性

          当a1<a2,b1<b2时,满足原式,可以叠放。

       定理得证。

   由上述定理知,设si=ai+bi,则f[i]只可能由{f[j]|sj<si}转移得到。故将a+b得值设为阶段,进行转移。

Code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#define maxn 100inline void qr(int &x) {char ch=getchar();int f=1;while(ch>'9'||ch<'0')    {if(ch=='-')    f=-1;ch=getchar();}while(ch>='0'&&ch<='9')    x=(x<<1)+(x<<3)+(ch^48),ch=getchar();x*=f;return;
}inline int max(const int &a,const int &b) {if(a>b) return a;else return b;}
inline int min(const int &a,const int &b) {if(a<b) return a;else return b;}
inline int abs(const int &x) {if(x>0) return x;else return -x;}inline void swap(int &a,int &b) {int c=a;a=b;b=c;return;
}int n,a,b,c,frog[maxn];struct Block {int h,l1,l2;
};
Block block[maxn];int top,cnt,ans;inline void add(int x,int y,int z) {block[++top].h=x;block[top].l1=y;block[top].l2=z;if(block[top].l1<block[top].l2)    swap(block[top].l2,block[top].l1);block[++top].h=y;block[top].l1=x;block[top].l2=z;if(block[top].l1<block[top].l2)    swap(block[top].l2,block[top].l1);block[++top].h=z;block[top].l1=x;block[top].l2=y;if(block[top].l1<block[top].l2)    swap(block[top].l2,block[top].l1);
}void clear() {std::memset(block,0,sizeof block);top=0;std::memset(frog,0,sizeof frog);ans=0;
}inline bool cmp(const Block &a,const Block &b) {int sa=a.l1+a.l2,sb=b.l1+b.l2;return sa<sb;
}inline bool judge(const Block &a,const Block &b) {return (a.l1<b.l1&&a.l2<b.l2)||(a.l2<b.l1&&a.l1<b.l2);
}int main() {qr(n);while(n) {clear();for(int i=1;i<=n;++i) {a=b=c=0;qr(a);qr(b);qr(c);add(a,b,c);}std::sort(block+1,block+1+top,cmp);for(int i=1;i<=top;++i) {int &emm=block[i].h;frog[i]=emm;for(int j=1;j<i;++j) {if(judge(block[j],block[i])) frog[i]=max(frog[i],frog[j]+emm);}ans=max(ans,frog[i]);}printf("Case %d: maximum height = %d\n",++cnt,ans);n=0;qr(n);}return 0;
}

Summary

  1、写完dp和爆搜对拍一下!!!

   2、dp中阶段可能是一个非常难以想象的量,比如二元组的求和,在求拓扑序时可以考虑一些特殊性质。

   3、求拓扑序慎用sort

转载于:https://www.cnblogs.com/yifusuyi/p/9218939.html

【DP】【Uva437】UVA437 The Tower of Babylon相关推荐

  1. 【C++心路历程25】课堂讲义【dp加单调队列】

    [问题描述] 高二数学<课堂讲义>总共有n道题目要抄,编号1..n,抄每道题所花时间不一样,抄第i题要花 a[i] 分钟.由于 xxx还要准备IOI,显然不能成天写课堂讲义.xxx决定只用 ...

  2. 【HDU 4905 多校联合】The Little Devil II【DP+四边形不等式优化】

    题意:给出一个数列,每次你可以选择相邻的两个数字进行求GCD,然后得到的数字把这两个数字替代,得到GCD的权值,求最后剩下一个数字后的最大的权值(权值初始是数列的和) 思路:定义dp[i][j]表示区 ...

  3. ssl1236-逃亡准备【dp之多重背包】

    Description 在<Harry Potter and the Deathly Hallows>中,Harry Potter他们一起逃亡,现在有许多的东西要放到赫敏的包里面,但是包的 ...

  4. Codeforces 621E Wet Shark and Block【dp + 矩阵快速幂】

    题意: 有b个blocks,每个blocks都有n个相同的0~9的数字,如果从第一个block选1,从第二个block选2,那么就构成12,问对于给定的n,b有多少种构成方案使最后模x的余数为k. 分 ...

  5. lightoj1145 【DP优化求方案】

    题意: 有一个k面的骰子,然后问你n个骰子朝上的面数字之和=s的方案: 思路: dp[i][j] 代表 前 i 个骰子组成 j 有多少种方案: 显然 dp[i][j] = dp[i - 1][j - ...

  6. conda安装tensorflow-gpu简洁版_【DP系列教程02】DeePMDkit:conda安装 amp; 离线安装

    点开安装教程前,是不是已经做好了看一篇万字长文的心理准备.DP君既然可以教会大家5分钟setup一个DeePMD-kit训练,就一定要教会大家如何在5分钟内学会安装DeePMD-kit.当然了,这样高 ...

  7. bzoj 2131: 免费的馅饼【dp+树状数组】

    简单粗暴的dp应该是把馅饼按时间排序然后设f[i]为i接到馅饼能获得的最大代价,转移是f[i]=max(f[j])+v[i],t[j]<=t[i],2t[i]-2t[j]>=abs(p[i ...

  8. bzoj 1778: [Usaco2010 Hol]Dotp 驱逐猪猡【dp+高斯消元】

    算是比较经典的高斯消元应用了 设f[i]为i点答案,那么dp转移为f[u]=Σf[v]*(1-p/q)/d[v],意思是在u点爆炸可以从与u相连的v点转移过来 然后因为所有f都是未知数,高斯消元即可( ...

  9. P6847-[CEOI2019]Magic Tree【dp,线段树合并】

    正题 题目链接:https://www.luogu.com.cn/problem/P6847 题目大意 nnn个点的一棵树上,每个时刻可以割掉一些边,一些节点上有果实表示如果在did_idi​时刻这个 ...

  10. jzoj3859-孤独一生【dp,树状数组】

    正题 题目链接:https://jzoj.net/senior/#main/show/3859 题目大意 nnn个台阶,第iii个高度为hih_ihi​,把它分为两个集合,使得两个集合中相邻的hih_ ...

最新文章

  1. python 字符串操作_python中字符串的常见操作(一)
  2. qt 中如何播放声音(QSound)
  3. 目标跟踪从0到1:算法与实践
  4. Linux的解决vmware的Linux系统IP自动变化
  5. Servlet跳转到JSP页面后的路径问题相关解释
  6. Canny边缘检测及C++实现(转载)
  7. 数据结构:分块-区间加法、区间乘法和单点查询
  8. Pentium 4处理器架构/微架构/流水线 (8) - NetBurst执行核详解 - 指令时延与吞吐量
  9. Flask—10-项目部署(02)
  10. java 试卷自动生成_基于JAVA的试题自动生成系统 - WEB源码|JSP源码/Java|源代码 - 源码中国...
  11. 自学python后自己接单-自学Python 后端一年半,如何写简历包装自己得到面试机会?...
  12. [转载] 致 Python 初学者
  13. ATA/SATA/SCSI/SAS/FC总线简介
  14. 过拟合 准确率大幅下降_梯度下降和过拟合和归一化
  15. dede采集-织梦全自动采集插件-织梦免费采集插件
  16. Java实现泛型解析工具类-GenericsUtils
  17. Form表单提交数据的几种方式
  18. 给class类加css样式,addClass()
  19. ar8171 linux网卡驱动下载,ar8171 8175网卡驱动
  20. 通俗理解LDA主题模型(转)

热门文章

  1. L3-005. 垃圾箱分布-PAT团体程序设计天梯赛GPLT(Dijkstra)
  2. 1040. 有几个PAT(25)- PAT乙级真题
  3. JavaScript声明变量详解
  4. 忘记root密码后怎么解决?克隆虚拟机后如何实现两台linux相互登录?
  5. Watson的未来就是IBM的未来
  6. Android用canvas画哆啦A梦
  7. PowerEdge r730xd 安装centos 6.7
  8. hadoop JOB的性能优化实践
  9. PHP 处理TXT文件(打开/关闭/检查/读取)
  10. 为vsftpd添加虚拟用户的脚本