【基础算法】嵌套矩形

来源:互联网 发布:网络配音员招聘 编辑:程序博客网 时间:2024/05/17 12:22

【基础算法】嵌套矩形

时间限制: 1 Sec  内存限制: 128 MB

题目描述

有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


本可按长排序后,以宽作一个最长上升子序列问题,但由于长宽可互换问题,博主的做法是将矩形长宽交换复制一份后再做,代码如下。
#include<cstdio>#include<iostream>#include<cstring>#include<cmath>#include<algorithm>#include<stack>#include<queue>#include<vector>#include<map>#define INF 0x3f3f3f3f#define LL long long intLL getint(){    LL ans=0,f=1;char c;    while((c=getchar())<'0'||c>'9')if(c=='-')f=-f;    while(c>='0'&&c<='9'){ans=ans*10+c-'0';c=getchar();}    return ans*f;}using namespace std;struct square{    int x,y,k;    square(){}    square(int a,int b,int c){x=a;y=b;k=c;}    square rev(){return square(y,x,k);}    bool operator<(const square &rhs)const{        //if(x<rhs.x)return 1;        //if(x>rhs.x)return 0;        //return 1;        //return y<rhs.y;        if(x>rhs.x)return 1;        if(x<rhs.x)return 0;        return k<rhs.k;    }    bool operator>(const square &rhs)const{return rhs<*this;}}s[2016];int ans[2016],fa[2016],an=1;void p(int d){    if(!fa[d])printf("%d",s[d].k);    else{p(fa[d]);printf(" %d",s[d].k);}}int main(){    int n=getint(),i,j;    for(i=1;i<=n;++i){        s[2*i-1]=square(getint(),getint(),i);        s[2*i]=s[2*i-1].rev();        ans[2*i-1]=ans[2*i]=1;        //fa[2*i-1]=fa[2*i]=INF;    }    sort(s+1,s+2*n+1);    for(i=1;i<=2*n;++i)        for(j=1;j<i;++j)            if(s[j].x>s[i].x&&s[j].y>s[i].y&&ans[j]+1>=ans[i]){                if(ans[j]+1>ans[i]||!fa[i]||s[fa[i]].k>s[j].k)fa[i]=j;                ans[i]=ans[j]+1;                //if(!fa[i]||s[fa[i]].k>s[j].k)fa[i]=j;                if(ans[i]>ans[an]||(ans[i]==ans[an]&&s[i].k<s[an].k))an=i;            }    printf("%d\n",ans[an]);    for(i=an;fa[i];i=fa[i])        printf("%d ",s[i].k);    printf("%d\n",s[i].k);}

0 0