题意:
给出一些长方体的长宽高,求能叠起来的最高高度。
注意:在叠的过程中,下面一块的长和宽要严格大于上面一块,每种类型的长方体有无限种。
思路:
既然一种长方体可以有六种摆放方式,那我们不如直接将方向固定,这样把输出的一种长方体看成是6种,之后开始叠。初学动态规划,理解的不是很透彻,大概思想就是:当你叠第n个时,你要确保前面的n-1个叠放的是最优。这样一直叠放到最后一个,当然在叠的时候要确保长和宽要满足条件。
#include<iostream>
#include<algorithm>
using namespace std;
struct st{int x,y,z;
}a[5000];
bool cmp( st a,st b){return a.x>b.x;
}
int dp[5000],ca=1;
int main(){int n,x,y,z;while(scanf("%d",&n)&&n){int co=0;for(int i=0;i<n;i++){scanf("%d%d%d",&x,&y,&z);a[co].x=x;a[co].y=y;a[co].z=z;co++;a[co].x=y;a[co].y=x;a[co].z=z;co++;a[co].x=y;a[co].y=z;a[co].z=x;co++;a[co].x=z;a[co].y=y;a[co].z=x;co++;a[co].x=x;a[co].y=z;a[co].z=y;co++;a[co].x=z;a[co].y=x;a[co].z=y;co++;}sort(a,a+co,cmp);for(int i=0;i<co;i++){dp[i]=a[i].z;for(int j=i-1;j>0;j--){if(a[i].x<a[j].x&&a[i].y<a[j].y)dp[i]=max(dp[i],dp[j]+a[i].z); }}int mx=dp[0];for(int i=1;i<co;i++)if(dp[i]>mx) mx=dp[i];printf("Case %d: maximum height = %d\n",ca++,mx);}return 0;
}