您的位置:首页 > 其它

UVA - 103 Stacking Boxes

2014-11-20 19:14 405 查看
题目大意:有 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: