思路:每一种方块可以多次利用,不过最终只可以利用6种姿势,全部输入排序,然后从大到小dp
#include<iostream>
#include<vector>
#include<algorithm>
#include<string.h>
using namespace std;
struct rec{
int l, w,h;
};
bool cmp(rec r1, rec r2)
{
if (r1.l != r2.l)
return r1.l > r2.l;
else
return r1.w > r2.w;
}
vector<rec> v;
int dp[200];
bool suit(rec r1, rec r2)
{
if (r1.l > r2.l&&r1.w > r2.w)
return true;
return false;
}
int solve(int n)
{
for (int i = 0; i < n; i++)
dp[i] = v[i].h;
for (int i = 0; i < n; i++)
for (int j = i - 1; j >= 0; j--)
{
if (suit(v[j], v[i]))
dp[i] = max(dp[i], dp[j] + v[i].h);
}
int res = dp[0];
for (int i = 0; i < n; i++)
res = max(res, dp[i]);
return res;
}
int main()
{
int n;
int t = 1;
while (cin >> n&&n)
{
v.clear();
for (int i = 0; i < n; i++)
{
int x, y, z;
cin >> x >> y >> z;
v.push_back(rec{ x, y, z });
v.push_back(rec{ y, x, z });
v.push_back(rec{ z, x, y });
v.push_back(rec{ x, z, y });
v.push_back(rec{ y, z, x });
v.push_back(rec{ z, y, x });
}
sort(v.begin(), v.end(),cmp);
int ans=solve(6*n);
cout << "Case " << t++ << ": maximum height = " << ans << endl;
}
return 0;
}