hdu_1069 LIS变形

前端之家收集整理的这篇文章主要介绍了hdu_1069 LIS变形前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

类似LIS的思想,只能用LIS的 O(n2)的算法,O(nlogn)的算法用不了,因为每个数值加了权值!其实我感觉可以用树形dp的,因为他们是偏序关系,可以建一个hash图,复杂度O(nlogn)绝对可以,然后dp过程只要O(n)的复杂度,可以每次判断hash图中被自己覆盖元素的最大的那个值,然后加上自己的权值,就能推出自己所能达到的最大值,这样dp只要扫一遍就可以了,总复杂度O(nlogn)。。。。。那个。。。有谁知道怎么建hash图不

  1. #include<iostream>
  2. #include<vector>
  3. #include<algorithm>
  4. using namespace std;
  5.  
  6. struct pp
  7. {
  8. int x,y,h;
  9. bool operator == (const pp& cmp) const
  10. {
  11. if(x==cmp.x && y==cmp.y)
  12. {
  13. return true;
  14. }
  15. else
  16. {
  17. return false;
  18. }
  19. }
  20. bool operator < (const pp& cmp) const
  21. {
  22. if(x!=cmp.x)
  23. {
  24. return x<cmp.x;
  25. }
  26. else if(y!=cmp.y)
  27. {
  28. return y<cmp.y;
  29. }
  30. else
  31. {
  32. return h<cmp.h;
  33. }
  34. }
  35. }p;
  36.  
  37. int a,b,c,N,ca,tmax,maxh,dp[200];
  38. vector<pp>va,vb;
  39.  
  40. inline void pushinto()
  41. {
  42. p.x=a;
  43. p.y=b;
  44. p.h=c;
  45. va.push_back(p); // a b c
  46. swap(p.x,p.y);
  47. va.push_back(p); // b a c
  48. swap(p.y,p.h);
  49. va.push_back(p); // b c a
  50. swap(p.x,p.y);
  51. va.push_back(p); // c b a
  52. swap(p.y,p.h);
  53. va.push_back(p); // c a b
  54. swap(p.x,p.y);
  55. va.push_back(p); // a c b
  56. return ;
  57. }
  58. void uniquecopy()
  59. {
  60. sort(va.begin(),va.end());
  61. vb.push_back(va[0]);
  62. for(int i=1;i<va.size();i++)
  63. {
  64. if( va[i] == vb.back() )
  65. {
  66. if(va[i].h > vb.back().h)
  67. {
  68. vb.back().h = va[i].h;
  69. }
  70. }
  71. else
  72. {
  73. vb.push_back(va[i]);
  74. }
  75. }
  76. return ;
  77. }
  78. void dpstart()
  79. {
  80. memset(dp,sizeof(dp));
  81. maxh=dp[0]=vb[0].h;
  82. for(int i=1;i<vb.size();i++)
  83. {
  84. tmax=0;
  85. for(int j=i-1;j>=0;j--)
  86. {
  87. if(vb[i].y > vb[j].y && vb[i].x != vb[j].x)
  88. {
  89. if(dp[j]>tmax)
  90. {
  91. tmax=dp[j];
  92. }
  93. }
  94. }
  95. dp[i]=vb[i].h+tmax;
  96. if(dp[i]>maxh)
  97. {
  98. maxh=dp[i];
  99. }
  100. }
  101. printf("Case %d: maximum height = ",ca++);
  102. cout<<maxh<<endl;
  103. return ;
  104. }
  105. int main()
  106. {
  107. ca=1;
  108. while(cin>>N)
  109. {
  110. if(0 == N)
  111. {
  112. break;
  113. }
  114. va.clear();
  115. vb.clear();
  116. for(int i=1;i<=N;i++)
  117. {
  118. cin>>a>>b>>c;
  119. pushinto();
  120. }
  121. uniquecopy();
  122. dpstart();
  123. }
  124. return 0;
  125. }
  126.  

猜你在找的VB相关文章