给若干种木块(x,y,z),每种要多少都可以,但接触面下面的长宽必须严格大于上面的对应的长宽,问最高能摞多高
首先,由于长度是严格大于的,因此每种木块就只需要按照xoy yoz xoz 为地面处理为三个木块就好【多了的话是不可能放的】
然后假设XOY为处理好的的3*n个木块的底面,先按照X小到大排序,然后dp一下yi>yj的情况下 最大的高度就好
dp[i]=max(dp[j])+z[i] (i>j>=1 and Yi>Yj )
以为pair很慢,刚从获得的姿势说pair其实很快>_<
#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> PII;
typedef pair<PII,int> PIII;
int n;
int cas;
PIII q[1000];
void Gao()
{
int nn=0;
int ans[1000]={0};
for (int i=0;i<n;i++)
{
int a[3];
for (int j=0;j<3;j++) cin>>a[j];
sort(a,a+3);
nn++;
q[nn]=make_pair(make_pair(a[2],a[1]),a[0]);
nn++;
q[nn]=make_pair(make_pair(a[2],a[0]),a[1]);
nn++;
q[nn]=make_pair(make_pair(a[1],a[0]),a[2]);
}
sort(q+1,q+nn+1);
int ret=0;
for (int i=1;i<=nn;i++)
{
for (int j=i-1;j>=1;j--)
{
if (q[i].first.first> q[j].first.first && q[i].first.second>q[j].first.second)
ans[i]=max(ans[i],ans[j]);
}
ans[i]+=q[i].second;
ret=max(ans[i],ret);
}
cas++;
printf("Case %d: maximum height = %d\n",cas,ret);
}
int main()
{
cas=0;
//freopen("a.in","r",stdin);
while (cin>>n && n)
Gao();
return 0;
}