题目大意:有 n 种类型的长方体,现在给出每中长方体的长宽高, 然后要选取若干个长方体来玩堆积木(可以选取同种类型的长方体), 要尽量使得堆出来的塔越高, 堆积木的时候要求下面的积木长宽一定要分别大于上面的那个积木(这样同种积木也有可能叠加)
解题思路:DAG最长路径, 让一种长方体分解成三个长方体.然后用普通的最长路径去做
#include <cstdio> #include <algorithm> using namespace std; struct Node { int x; int y; int h; } P[100]; int cmp(Node a, Node b) { return a.x != b.x ? a.x < b.x : a.y < b.y; } int main() { int n, a[3], T = 0; while (scanf("%d", &n), n) { n *= 3; for (int i = 0; i < n; i++) { scanf("%d%d%d", &a[0], &a[1], &a[2]); sort(a, a + 3); P[i].x = a[2]; P[i].y = a[1]; P[i].h = a[0]; P[++i].x = a[2]; P[i].y = a[0]; P[i].h = a[1]; P[++i].x = a[1]; P[i].y = a[0]; P[i].h = a[2]; } sort(P, P + n, cmp); int DP[100] = {0}, ans = 0; for (int i = 0; i < n; i++) { DP[i] = P[i].h; for (int j = 0; j < i; j++) if (P[i].x > P[j].x && P[i].y > P[j].y && DP[j] + P[i].h > DP[i]) DP[i] = DP[j] + P[i].h; if (DP[i] > ans) ans = DP[i]; } printf("Case %d: maximum height = %d\n", ++T, ans); } return 0; }