HDU 1069 Monkey and Banana(DP——最大递减子序列)
Posted Reqaw’s Blog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 1069 Monkey and Banana(DP——最大递减子序列)相关的知识,希望对你有一定的参考价值。
题目链接:
http://acm.split.hdu.edu.cn/showproblem.php?pid=1069
题意描述:
给n块砖,给出其长,宽和高
问将这n块砖,怎样叠放使得满足以下条件使得高度最高,是多少
条件:A砖要放在B砖上,必须满足,A的长和宽都同时小于B的长和宽。
解题思路:
首先给出的n块砖有6种摆放方法,但是有两两的摆放方式情况下,他们的高是一样的,那么只用选取一种即可,那么一块砖可以有3种摆放方法。
先将三条边进行一个排序,找出不同高的三种砖记录,再对所有这些砖进行一个排序,之后使用DP思想,让每一块砖作为最顶层的砖,遍历有它之前符合条件的砖,
每次更新dp数组为新高度即可,最后在dp数组中寻找最大高度即可。
AC代码:
1 #include<stdio.h> 2 #include<string.h> 3 #include<math.h> 4 #include<ctype.h> 5 #include<algorithm> 6 using namespace std; 7 const int inf=99999999; 8 9 struct B 10 { 11 int c,k,h; 12 }; 13 struct B b2[2600]; 14 //先按长排,长度相同再按宽排 15 int cmp(struct B a,struct B b) 16 { 17 if(a.c == b.c) 18 return a.k > b.k; 19 return a.c > b.c; 20 } 21 int main() 22 { 23 int n,i,j,k,t=1,dp[2610],b1[3]; 24 while(scanf("%d",&n),n != 0) 25 { 26 j=0; 27 for(i=1;i<=n;i++) 28 { 29 scanf("%d%d%d",&b1[0],&b1[1],&b1[2]); 30 sort(b1,b1+3);//先将三条边进行一个排序 31 32 b2[j].c=b1[1]; 33 b2[j].k=b1[0]; 34 b2[j++].h=b1[2]; 35 36 b2[j].c=b1[2]; 37 b2[j].k=b1[1]; 38 b2[j++].h=b1[0]; 39 40 b2[j].c=b1[2]; 41 b2[j].k=b1[0]; 42 b2[j++].h=b1[1]; 43 } 44 /*for(i=0;i<j;i++) 45 printf("%d %d %d\n",b2[i].c,b2[i].k,b2[i].h);*/ 46 sort(b2,b2+j,cmp); 47 /*for(i=0;i<j;i++) 48 printf("%d %d %d\n",b2[i].c,b2[i].k,b2[i].h);*/ 49 int maxh=-inf; 50 for(int z=0;z<j;z++) 51 { 52 dp[z]=b2[z].h; 53 for(i=z-1;i>=0;i--) 54 { 55 if(b2[i].c > b2[z].c && b2[i].k > b2[z].k) 56 dp[z] = max(dp[z],dp[i] + b2[z].h); 57 } 58 if(dp[z]> maxh) 59 maxh=dp[z]; 60 } 61 printf("Case %d: maximum height = %d\n",t++,maxh); 62 } 63 return 0; 64 }
以上是关于HDU 1069 Monkey and Banana(DP——最大递减子序列)的主要内容,如果未能解决你的问题,请参考以下文章
Monkey and Banana HDU - 1069 (基础dp)
[2016-03-30][HDU][1069][Monkey and Banana]