您的位置:首页 > 其它

UVA103

2016-08-07 12:26 183 查看
UVA 103

题意:

有 n 个盒子,每个盒子由 k 个元素表示,把盒子互相嵌套起来,
只有表示盒子的每个元素都大于另一个盒子的每个元素的时候才可以嵌套;元素间可以交换位置;
比如(5,1,3)可以放在 (2,4,6)里面。
问最多可以套多少个。

解题:

先把表示盒子的每个元素排序,再把每个盒子排序。用 LIS 求答案。

噫..盒子排序排了好久..傻了= =

#include<bits/stdc++.h>
using namespace std;
struct node {
int s,id;
int num[25];
bool operator < (const node &b) const {
for(int i=1; i<=s; i++) {
if(num[i] < b.num[i]) return true;
if(num[i] > b.num[i]) return false;
}
return true;
}
void nsort(){
sort(num+1,num+1+s);
}
}a[35];
int main()
{
int n,k;
while(scanf("%d%d",&n,&k)!=EOF) {
for(int i=1;i<=n;i++) {
for(int j=1;j<=k;j++) {
scanf("%d",&a[i].num[j] );
a[i].s = k; a[i].id = i;
}
a[i].nsort();
}
sort(a+1,a+n+1);
int len = 1, d[35] = {0};
int pre[35] = {0}, ed = 1;
for(int i=0;i<35;i++) pre[i] = i;
for(int i=1;i<=n;i++) {
d[i] = 1;
for(int j=1;j<i;j++) {
int ov = 0;
for(int r=1;r<=k;r++) {
if(a[j].num[r] >= a[i].num[r]) {
ov = 1; break;
}
}
if( (!ov) && (d[j]+1 > d[i]) ) {
d[i] = d[j] + 1;
pre[i] = j;
if(d[i] > len) {
len = d[i]; ed = i;
}
}
}
}
int ans[35] = {0}, cnt = 0;
while(ed != pre[ed]) {
ans[cnt++] = a[ed].id;
ed = pre[ed];
}
ans[cnt] = a[ed].id;
printf("%d\n",len);
for(int i=cnt;i>0;i--)
printf("%d ",ans[i]);
printf("%d\n",ans[0]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: