【基础算法】嵌套矩形

来源:互联网 发布:php cli 获取服务器ip 编辑:程序博客网 时间:2024/05/17 15:03

题目描述

有N个矩形,每个矩形可以用两个整数a,b描述,表示它的长和宽。矩形X(a, b)可以嵌套在矩形Y(c,d)中当且仅当a<c,b<d,或者b<c,a<d(相当于把矩形X旋转90度)。例如(1,5)可以嵌套在(6,2)内,但不能嵌套在(3,4)内。注意,矩形既可以嵌套于它左边的大矩形,也可以嵌套于它右边的大矩形。

你的任务是选出尽量多的矩形排成一行,使得除了最后一个外,每一个矩形都可以嵌套在下一个矩形内。

输入

第1行:1个整数N(1<=N<=1000)

第2..N+1行:每行2个整数,分别表示矩形的两个边长。每个矩形依次编号为1~N。

输出

第1行:1个整数K,表示嵌套的最大层数。

第2行:K个整数,表示依次嵌套的矩形的编号。若有多组解,输出字典序最小的一组解。

样例输入

 (如果复制到控制台无换行,可以先粘贴到文本编辑器,再复制)

814 915 1918 129 1019 1715 92 1313 10

样例输出

44 8 3 2

提示

样例说明:最大嵌套深度为4。4个矩形编号分别是:4 8 3 2,它们的大小关系是:

(9, 10) < (13, 10) < (18,12) < (15,19)

分析

在输入时预处理,使宽始终小于等于长。以宽从大到小排序,按长做最下降升子序列。(P.S.从小到大排序后做最长上升子序列不行)。Mind:记录时要以最开始输入的顺序而不是排序后的顺序。
# include <iostream># include <stdio.h># include <string.h># include <algorithm># define MAXn 10+1000using namespace std;struct node{    int x,y,a;}an[MAXn];bool cmp(node a,node b)  {      if(a.x>b.x) return 1;      else if(a.x==b.x&&a.y>b.y)          return 1;      else return 0;  } bool c(node a,node b){    if(a.x<b.x&&a.y<b.y)  return 1;    else    return 0;}bool first;int n,K=-1,f[MAXn],g[1010];void print3(int x){    if(first)        putchar(' ');    else    first=1;    printf("%d",x);    if(g[x])        print3(g[x]);}int main(){       int i,x,y,j;    scanf("%d",&n);    for(i=1;i<=n;i++){        f[i]=1;        scanf("%d %d",&x,&y);        an[i].a=i;        if(x>y)  an[i].x=y,an[i].y=x;        else    an[i].x=x,an[i].y=y;    }    sort(an+1,an+n+1,cmp);    for(i=2;i<=n;i++){        for(j=1;j<i;j++)            if(c(an[i],an[j])){                if(f[an[j].a]+1>f[an[i].a]){                    f[an[i].a]=f[an[j].a]+1;                    g[an[i].a]=an[j].a;                }                if(f[an[i].a]==f[an[j].a]+1&&an[j].a<g[an[i].a])                    g[an[i].a]=an[j].a;            }        if(K<f[an[i].a])            K=f[an[i].a];    }    printf("%d\n",K);    for(i=1;i<=n;i++)        if(f[i]==K)            break;    print3(i);    putchar(10);    return 0;    }


0 0
原创粉丝点击