描述
UVA437
思路
每种长方体可重复使用, 而每种长方体有六种摆放方式,所以可以将每个可随机摆放长方体视为摆放方式固定的六个长方体。
对于与长方体的堆叠,考虑上下长方体的x, y , 所以可以将长方体按x降序排列。 然后就是动态规划问题.
题解
#include <algorithm>
#include <string>
#include <iostream>
#include <set>
#include <vector>
#include <queue>
#include <cstring>
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <stack>
int dp[200];
struct Rec {
int a, b, c;
Rec() = default;
Rec(int a, int b, int c) : a(a), b(b), c(c) {}
bool operator < (const Rec &rec) const
{
if (a < rec.a)
return true;
else if (a > rec.a)
return false;
else
{
if (b < rec.b)
return true;
else if (b > rec.b)
return false;
else
{
return c < rec.c;
}
}
}
}rec[200];
int main()
{
int cases = 0;
int t;
while (scanf("%d", &t), t)
{
cases++;
int cnt = 0;
for (int i = 0; i < t; i++)
{
int a, b, c;
scanf("%d %d %d", &a, &b, &c);
rec[cnt++] = Rec(a, b, c);
rec[cnt++] = Rec(a, c, b);
rec[cnt++] = Rec(b, a, c);
rec[cnt++] = Rec(b, c, a);
rec[cnt++] = Rec(c, a, b);
rec[cnt++] = Rec(c, b, a);
}
std::sort(std::begin(rec), std::begin(rec) + cnt);
for (int i = 0; i < cnt; i++)
dp[i] = rec[i].c;
for (int i = 1; i < cnt; i++)
for (int j = 0; j < i; j++)
if (rec[i].a > rec[j].a && rec[i].b > rec[j].b)
dp[i] = std::max(dp[i], dp[j] + rec[i].c);
printf("Case %d: maximum height = %d\n", t, *std::max_element(std::begin(dp), std::begin(dp) + cnt));
}
return 0;
}
Soinux
发布了3 篇原创文章 · 获赞 0 · 访问量 14
私信
关注