【基础算法】嵌套矩形
来源:互联网 发布:网络配音员招聘 编辑:程序博客网 时间: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
- 【基础算法】嵌套矩形
- 【基础算法】嵌套矩形
- 动态规划算法:嵌套矩形
- #DP基础题#嵌套矩形(输出路径)
- nyoj 16 矩形嵌套(基础dp)
- java基础--for循环嵌套打印矩形
- 矩形嵌套
- 矩形嵌套
- 矩形嵌套
- 矩形嵌套
- 矩形嵌套
- 嵌套矩形
- 嵌套矩形
- 嵌套矩形
- 矩形嵌套
- 矩形嵌套
- 矩形嵌套
- 矩形嵌套
- Android APP更新——service后台下载、进度提示、自动安装
- Apache 部署https证书
- 几道java测试题
- 欢迎使用CSDN-markdown编辑器
- HummingBad恶意软件(介绍)
- 【基础算法】嵌套矩形
- 在cmd命令行下编译运行C/C++源文件
- Linux 通过lseek()来实现文件大小的设置
- SQL
- Java制作证书的工具keytool用法总结
- QML之窗口(无边框、透明及拖拽)
- 使用nexus在局域网内搭建maven私服及idea的使用
- Codeforces Round #360 (Div. 2)——C. NP-Hard Problem(BFS染色判二分图)
- hadoop入门级总结一:HDFS