UVA - 437 The Tower of Babylon

题目大意:有 n 种类型的长方体,现在给出每中长方体的长宽高, 然后要选取若干个长方体来玩堆积木(可以选取同种类型的长方体), 要尽量使得堆出来的塔越高, 堆积木的时候要求下面的积木长宽一定要分别大于上面的那个积木(这样同种积木也有可能叠加)


解题思路:DAG最长路径, 让一种长方体分解成三个长方体.然后用普通的最长路径去做

#include 
#include 
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;
}


你可能感兴趣的:(动态规划,ACM,刷题录)