标签:
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1069
题目意思:给n种箱子,每种有足够多的箱子,把箱子从下往上叠,要求下面的要比上面的长宽都要大,问最高叠多高。
分析:每种箱子有3种状态,记录完后,简单dp。
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> using namespace std; struct node { int x,y,z; } a[100]; int dp[100]; bool cmp(node a,node b) { if(a.x*a.y>b.x*b.y) return true; return false; } int main() { int n,x1,x2,x3; int ii=1; while(scanf("%d",&n),n) { int k=0; int d[10]; for(int i=0; i<n; i++) { scanf("%d%d%d",&d[1],&d[2],&d[3]); //sort(d+1,d+4); a[k].x=d[1],a[k].y=d[2],a[k++].z=d[3]; a[k].x=d[1],a[k].y=d[3],a[k++].z=d[2]; a[k].x=d[2],a[k].y=d[3],a[k++].z=d[1]; } sort(a,a+k,cmp); for(int i=0; i<k; i++) dp[i]=a[i].z; for(int i=k-2; i>=0; i--) { for(int j=i+1; j<k; j++) { if(a[i].x>a[j].x&&a[i].y>a[j].y || a[i].x >a[j].y&&a[i].y>a[j].x) if(dp[i]<dp[j]+a[i].z) dp[i]=dp[j]+a[i].z; } } int Max=dp[0]; for(int i=1; i<k; i++) { if(dp[i]>Max) Max=dp[i]; } printf("Case %d: maximum height = %d\n",ii++,Max); } return 0; }
标签:
原文地址:http://www.cnblogs.com/mengzhong/p/5007826.html