HDU1069 Monkey and Banana 简单dp
题意:
把给定的长方体(不限)叠加在一起,叠加的条件是,上面一个长方体的长和宽都比下面长方体的长和宽短;
求这些长方体能叠加的最高的高度.(其中(3,2,1)可以摆放成(3,1,2)、(2,1,3)等).
/* *********************************************** Author :devil Created Time :2015/12/7 20:38:42 ************************************************ */ #include <iostream> #include <algorithm> #include <cstring> #include <cmath> #include <queue> #include <map> #include <set> #include <vector> #include <cstdio> using namespace std; struct wq { int a,b,c; }p[100]; int dp[100],cnt; void add(int x,int y,int z) { p[cnt].a=x; p[cnt].b=y; p[cnt++].c=z; } bool cmp(wq a,wq b) { if(a.a!=b.a) return a.a>b.a; return a.b>b.b; } int main() { //freopen("in.txt","r",stdin); int n,x,y,z,cas=1; while(~scanf("%d",&n)&&n) { cnt=0; for(int i=0; i<n; i++) { scanf("%d%d%d",&x,&y,&z); if(x>y) swap(x,y); if(x>z) swap(x,z); if(y>z) swap(y,z); add(x,y,z); add(y,z,x); add(x,z,y); } sort(p,p+cnt,cmp); dp[0]=p[0].c; int ans=dp[0]; for(int i=1;i<cnt;i++) { dp[i]=p[i].c; for(int j=0;j<i;j++) if(p[i].a<p[j].a&&p[i].b<p[j].b) dp[i]=max(dp[i],dp[j]+p[i].c); ans=max(ans,dp[i]); } printf("Case %d: maximum height = %d\n",cas++,ans); } return 0; }