hdu-1069(dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1069
题意:一群猴子,给出n块砖的长x宽y高z,用这些砖拼起的高度最高是多少,
要求底下的砖的长宽都要大于上面那块。堆出高度最高的猴子最聪明。现在问最多能达到多高。
思路:从n块砖中找出x块砖并满足长宽要求使高度最高,可以用动态规划来做。
先按照砖的x,y升序排序,类似最长不下降子序列。
状态转移方程:dp[i]=h[i]+max(dp[0]……dp[i-1]);
参考文章:https://blog.csdn.net/lttree/article/details/26606947
#include<iostream> #include<cstdio> #include<vector> #include<algorithm> #include<cstring> using namespace std; struct Node{ int l,w,h; }; vector <Node> vc; int dp[100100]; bool cmp(Node a,Node b) { if(a.l!=b.l) return a.l<b.l; else return a.w<b.w; } int main(void) { int n,x,y,z,pt=1; Node tmp; while(~scanf("%d",&n)&&n) { vc.clear(); memset(dp,0,sizeof(dp)); while(n--) { scanf("%d %d %d",&x,&y,&z); tmp.l=x;tmp.w=y;tmp.h=z;vc.push_back(tmp); tmp.l=x;tmp.w=z;tmp.h=y;vc.push_back(tmp); tmp.l=y;tmp.w=x;tmp.h=z;vc.push_back(tmp); tmp.l=y;tmp.w=z;tmp.h=x;vc.push_back(tmp); tmp.l=z;tmp.w=y;tmp.h=x;vc.push_back(tmp); tmp.l=z;tmp.w=x;tmp.h=y;vc.push_back(tmp); } sort(vc.begin(),vc.end(),cmp); int mx,j,i,l=vc.size(); dp[0]=vc[0].h; for(i=1;i<l;i++) { mx=0; for(j=0;j<i;j++) { if(vc[j].l<vc[i].l&&vc[j].w<vc[i].w) mx=mx>dp[j]?mx:dp[j]; } dp[i]=vc[i].h+mx; } mx=0; for(i=0;i<l;i++) { mx=mx>dp[i]?mx:dp[i]; } printf("Case %d: maximum height = %d\n",pt++,mx); } return 0; }