UVA - 103 Stacking Boxes

题目大意:有 n 个 w 维立体, 输出立体互相嵌套的层数的最大值, 并输出嵌套方式, 可嵌套的要求是外层立体的   w 条边可以分别对应大于内层立体


解题思路:可以将每个立体的 w 边安照从小到大排序, 比较的时候逐一比较就可以判断出可否嵌套, 然后就是纯DAG 问题了


#include <cstdio>
#include <algorithm>
using namespace std;
int n, w;

struct Box {
	int Dime[15];
	int order;
	int next;
} box[35];

int cmp(Box a, Box b) {
	for (int i = 0; i < w; i++)
		if (a.Dime[i] != b.Dime[i])
			return a.Dime[i] > b.Dime[i];
	return 0;
}

int CMP(Box a, Box b) {
	for (int i = 0; i < w; i++)
		if (a.Dime[i] >= b.Dime[i])
			return 0;
	return 1;
}

int main() {
	while (scanf("%d%d", &n, &w) != EOF) {
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < w; j++)
				scanf("%d", &box[i].Dime[j]);
			sort(box[i].Dime, box[i].Dime + w);
			box[i].order = i;
		}
		sort(box, box + n, cmp);

		int DP[35] = {0}, MAX = 0, ans;
		for (int i = 0; i < n; i++) {
			int now = 0;
			for (int j = 0; j < i; j++)
				if (CMP(box[i], box[j]) && DP[j] > now) {
					now = DP[j];
					box[i].next = j;
				}

			DP[i] = now + 1;
			if (DP[i] > MAX) {
				MAX = DP[i];
				ans = i;
			}
		}

		printf("%d\n%d", MAX, box[ans].order + 1);
		while (--MAX) {
			ans = box[ans].next;
			printf(" %d", box[ans].order + 1);
		}
		printf("\n");
	}
	return 0;
}


你可能感兴趣的:(UVA - 103 Stacking Boxes)