Stacking Boxes UVA - 103(矩形嵌套)

大意是有一些n维的物体,他的边也是n条,如果将一个物体的边按任意顺序排列,只要有一种排列满足一一对应小于另一物体的边,就可以将这个物体嵌套进去另一个物体中,文最多能连续嵌套几个物体。

和最长递增子序列差不多,只不过这里需要重新写一下比较函数


 

Some concepts in Mathematics and Computer Science are simple in one or two dimensions but become
more complex when extended to arbitrary dimensions. Consider solving differential equations in several
dimensions and analyzing the topology of an
n
-dimensional hypercube. The former is much more
complicated than its one dimensional relative while the latter bears a remarkable resemblance to its
“lower-class” cousin.
Consider an
n
-dimensional “box” given by its dimensions. In two dimensions the box (2,3) might
represent a box with length 2 units and width 3 units. In three dimensions the box (4,8,9) can represent
a box
4
8
9
(length, width, and height). In 6 dimensions it is, perhaps, unclear what the box
(4,5,6,7,8,9) represents; but we can analyze properties of the box such as the sum of its dimensions.
In this problem you will analyze a property of a group of
n
-dimensional boxes. You are to determine
the longest
nesting string
of boxes, that is a sequence of boxes
b
1
; b
2
; : : : ; b
k
such that each box
b
i
nests
in box
b
i
+1
(
1
i < k
)
.
A box D = (
d
1
; d
2
; : : : ; d
n
) nests in a box E = (
e
1
; e
2
; : : : ; e
n
) if there is some rearrangement of the
d
i
such that when rearranged each dimension is less than the corresponding dimension in box E. This
loosely corresponds to turning box D to see if it will fit in box E. However, since any rearrangement
suffices, box D can be contorted, not just turned (see examples below).
For example, the box D = (2,6) nests in the box E = (7,3) since D can be rearranged as (6,2) so
that each dimension is less than the corresponding dimension in E. The box D = (9,5,7,3) does NOT
nest in the box E = (2,10,6,8) since no rearrangement of D results in a box that satisfies the nesting
property, but F = (9,5,7,1) does nest in box E since F can be rearranged as (1,9,5,7) which nests in E.
Formally, we define nesting as follows: box D = (
d
1
; d
2
; : : : ; d
n
)
nests
in box E = (
e
1
; e
2
; : : : ; e
n
)
if there is a permutation
of
1
: : : n
such that (
d
(1)
; d
(2)
; : : : ; d
(
n
)
) “fits” in (
e
1
; e
2
; : : : ; e
n
) i.e., if
d
(
i
)
< e
i
for all
1
i
n
.
Input
The input consists of a series of box sequences. Each box sequence begins with a line consisting of the
the number of boxes
k
in the sequence followed by the dimensionality of the boxes,
n
(on the same
line.)
This line is followed by
k
lines, one line per box with the
n
measurements of each box on one line
separated by one or more spaces. The
i
-th line in the sequence (
1
i
k
) gives the measurements for
the
i
-th box.
There may be several box sequences in the input file. Your program should process all of them and
determine, for each sequence, which of the
k
boxes determine the longest nesting string and the length
of that nesting string (the number of boxes in the string).
In this problem the maximum dimensionality is 10 and the minimum dimensionality is 1. The
maximum number of boxes in a sequence is 30.
Output
For each box sequence in the input file, output the length of the longest nesting string on one line
followed on the next line by a list of the boxes that comprise this string in order. The “smallest” or
“innermost” box of the nesting string should be listed first, the next box (if there is one) should be
listed second, etc.
The boxes should be numbered according to the order in which they appeared in the input file (first
box is box 1, etc.).
If there is more than one longest nesting string then any one of them can be output.
Sample Input
5 2
3 7
8 10
5 2
9 11
21 18
8 6
5 2 20 1 30 10
23 15 7 9 11 3
40 50 34 24 14 4
9 10 11 12 13 14
31 4 18 8 27 17
44 32 13 19 41 19
1 2 3 4 5 6
80 37 47 18 21 9
Sample Output
5
3 1 2 4 5
4
7 2 5 6

#include<iostream>
#include<string.h>
#include<algorithm>
#include<stdio.h>
#define maxn 310//最多的状态数
using namespace std;
int d[maxn];
int G[maxn][maxn];
int m,n;
struct Node{
    int a[15];//各个维度的长度
}node[maxn];
void print_path(int p){
    if (d[p]>1) printf("%d ",p);else printf("%d\n",p);
    for(int i=1;i<=m;i++)
        if (d[i]+1==d[p] && G[p][i]==1) {print_path(i);break;}
}
void readin(){
    for(int i=1;i<=m;i++){
        for(int j=1;j<=n;j++)
            scanf("%d",&node[i].a[j]);
    sort(node[i].a+1,node[i].a+n+1);
    }
}
void builtG(){
    memset(G,0,sizeof(G));
    for(int i=1;i<=m;i++){
        for(int j=1;j<=m;j++){
            if (i==j) continue;
            int mark=1;
            for(int k=1;k<=n;k++)
            if (node[i].a[k]>=node[j].a[k]){mark=0;break;}
            if (mark) G[i][j]=1;
        }
    }
}
int dp(int i){
    int &ans=d[i];
    if (ans>0) return ans;
    ans=1;
    for(int j=1;j<=m;j++) if (G[i][j]) ans=max(ans,dp(j)+1);
    return ans;
}
void slove(){
    readin();
    builtG();
    memset(d,0,sizeof(d));
    int ans=-1;int p=-1;
    for(int i=1;i<=m;i++){
        int k=dp(i);
        if (ans<k) {ans=k;p=i;}
    }
    printf("%d\n",ans);
    print_path(p);
    return ;
}
int main(){
    while(~scanf("%d%d",&m,&n)) slove();
    return 0;
}








  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值