【Solution】

接上一篇,在处理有向无环图的最长链问题的时候,可以在做拓扑排序的同时,一边做DP;

设f[i]表示第i个方块作为最上面的最高值;

f[y]=max(f[y],f[x]+h[y]);(x−>y)∈E

这样可以保证,按阶段进行DP,每次在获取f[x]的时候,你可以保证f[x]已经获得了;

最后取max(f[1..n])

【Code】

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define lson l,m,rt<<1
  4. #define rson m+1,r,rt<<1|1
  5. #define LL long long
  6. #define rep1(i,a,b) for (int i = a;i <= b;i++)
  7. #define rep2(i,a,b) for (int i = a;i >= b;i--)
  8. #define mp make_pair
  9. #define pb push_back
  10. #define fi first
  11. #define se second
  12. #define ms(x,y) memset(x,y,sizeof x)
  13. #define Open() freopen("D:\\rush.txt","r",stdin)
  14. #define Close() ios::sync_with_stdio(0)
  15. typedef pair<int,int> pii;
  16. typedef pair<LL,LL> pll;
  17. const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
  18. const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
  19. const double pi = acos(-1.0);
  20. const int N = 30;
  21. struct abc{
  22. LL c,k,g;
  23. };
  24. int n,b[4],nn,du[N*3+100];
  25. LL dp[N*3+100];
  26. abc a[N*3+100];
  27. vector <int> G[N*3+100];
  28. queue <int> dl;
  29. int main()
  30. {
  31. //Open();
  32. int kk = 0;
  33. while (~scanf("%d",&n) && n){
  34. kk++;
  35. ms(dp,-1);nn = 0;ms(du,0);
  36. rep1(i,1,N*3) G[i].clear();
  37. rep1(i,1,n){
  38. rep1(j,1,3)
  39. scanf("%d",&b[j]);
  40. sort(b+1,b+1+3);
  41. rep1(j,1,3){
  42. nn++;
  43. rep2(k,3,1)
  44. if (k!=j){
  45. a[nn].c = b[k];
  46. break;
  47. }
  48. rep1(k,1,3)
  49. if (k!=j){
  50. a[nn].k = b[k];
  51. break;
  52. }
  53. a[nn].g = b[j];
  54. }
  55. }
  56. n = nn;
  57. rep1(i,1,n)
  58. rep1(j,1,n)
  59. if (a[i].c > a[j].c && a[i].k > a[j].k){
  60. G[i].pb(j);
  61. du[j]++;
  62. }
  63. while (!dl.empty()) dl.pop();
  64. rep1(i,1,n)
  65. if (du[i]==0){
  66. dl.push(i);
  67. dp[i] = a[i].g;
  68. du[i] = -1;
  69. }
  70. while (!dl.empty()){
  71. int x = dl.front();
  72. dl.pop();
  73. int len = G[x].size();
  74. rep1(i,0,len-1){
  75. int y = G[x][i];
  76. if (dp[y]==-1){
  77. dp[y] = dp[x] + a[y].g;
  78. }else
  79. dp[y] = max(dp[y],dp[x]+a[y].g);
  80. du[y]--;
  81. if (du[y]==0){
  82. dl.push(y);
  83. du[y]= -1;
  84. }
  85. }
  86. }
  87. LL d = 0;
  88. rep1(i,1,n)
  89. d = max(d,dp[i]);
  90. printf("Case %d: maximum height = ",kk);
  91. printf("%lld\n",d);
  92. }
  93. return 0;
  94. }

【UVA 437】The Tower of Babylon(拓扑排序+DP,做法)的更多相关文章

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

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

  2. UVa 437 The Tower of Babylon

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

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

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

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

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

  5. UVA 437 The Tower of Babylon(DAG上的动态规划)

    题目大意是根据所给的有无限多个的n种立方体,求其所堆砌成的塔最大高度. 方法1,建图求解,可以把问题转化成求DAG上的最长路问题 #include <cstdio> #include &l ...

  6. UVA 437 The Tower of Babylon巴比伦塔

    题意:有n(n≤30)种立方体,每种有无穷多个.要求选一些立方体摞成一根尽量高的柱子(可以自行选择哪一条边作为高),使得每个立方体的底面长宽分别严格小于它下方立方体的底面长宽. 评测地址:http:/ ...

  7. DP(DAG) UVA 437 The Tower of Babylon

    题目传送门 题意:给出一些砖头的长宽高,砖头能叠在另一块上要求它的长宽都小于下面的转头的长宽,问叠起来最高能有多高 分析:设一个砖头的长宽高为x, y, z,那么想当于多了x, z, y 和y, x, ...

  8. UVA 437 "The Tower of Babylon" (DAG上的动态规划)

    传送门 题意 有 n 种立方体,每种都有无穷多个. 要求选一些立方体摞成一根尽量高的柱子(在摞的时候可以自行选择哪一条边作为高): 立方体 a 可以放在立方体 b 上方的前提条件是立方体 a 的底面长 ...

  9. UVA 427 The Tower of Babylon 巴比伦塔(dp)

    据说是DAG的dp,可用spfa来做,松弛操作改成变长.注意状态的表示. 影响决策的只有顶部的尺寸,因为尺寸可能很大,所以用立方体的编号和高的编号来表示,然后向尺寸更小的转移就行了. #include ...

随机推荐

  1. Activity-数据状态的保存

    由于手机是便捷式移动设备,掌握在用户的手中,它的展示方向我们是无法预知的,具有不确定性.平时我们拿着手机多数为竖屏,但有时候我们感觉累了也会躺着去使用手机,那么这时手机屏幕的展示方向可能已经被用户切换 ...

  2. 51nod 1572 宝岛地图 (预处理四个方向的最大步数优化时间,时间复杂度O(n*m+k))

    题目: 这题如果没有时间限制的话暴力可以解,暴力的话时间复杂度大概是O(k*n),1s的话非常悬. 所以我们需要换个思路,我们对每个点预处理四个方向最多能走的步数,这个预处理时间复杂度是O(n*m). ...

  3. JQuery插件的写法 (转:太棒啦!)

    JQuery插件写法的总结 最近Web应用程序中越来越多地用到了JQuery等Web前端技术.这些技术框架有效地改善了用户的操作体验,同时也提高了开发人员构造丰富客户 端UI的效率.JQuery本身提 ...

  4. 3ds Max做的卡通狗教程

    使用软件::3ds Max 软件下载:http://www.xy3dsmax.com/xiazai.html 全教程完,学完记得交作业.如果本教程对您有所帮助,请推荐给你的朋友.

  5. vue的表格加单选框

    https://www.cnblogs.com/calamus/p/8569196.html

  6. layui Layui-Select多选的使用和注意事项

    1.最近买了layadmin的后台框架,使用Layui-Select总结如下 A.配置:我采用的全局引入配置的方式 赋值(选中状态)

  7. hibernate 或jpa 中使用 AliasToBeanResultTransformer 自定义类型转换ResultTransformer 下划线转驼峰

    jpa中使用 sql查询时,返回结果直接转为实体bean的实现, 需要自定义一个ResultTransformer,如下, import java.util.Arrays; import org.ap ...

  8. Windows下使用python绘制caffe中.prototxt网络结构数据可视化

    准备工具: 1. 已编译好的pycaffe 2. Anaconda(python2.7) 3. graphviz 4. pydot  1. graphviz安装 graphviz是贝尔实验室开发的一个 ...

  9. OnClientClick知识+一个上传的例子

    文件名:<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox> <asp ...

  10. JavaScript总结(2)

    <!--脚本部分-->06 <script type="text/javascript">07 date_object=new Date();08 what ...