【基础算法】嵌套矩形
来源:互联网 发布: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
- 【基础算法】嵌套矩形
- 【基础算法】嵌套矩形
- 动态规划算法:嵌套矩形
- #DP基础题#嵌套矩形(输出路径)
- nyoj 16 矩形嵌套(基础dp)
- java基础--for循环嵌套打印矩形
- 矩形嵌套
- 矩形嵌套
- 矩形嵌套
- 矩形嵌套
- 矩形嵌套
- 嵌套矩形
- 嵌套矩形
- 嵌套矩形
- 矩形嵌套
- 矩形嵌套
- 矩形嵌套
- 矩形嵌套
- 通信组件之Intent的复杂数据的传递
- Android 之HierarchyViewer - 4939
- Collections.sort()方法对象排序
- CI框架搜索分页
- 使用Nexus搭建Maven私服
- 【基础算法】嵌套矩形
- 使用Quagga测试IPv4/IPv6 BGP双栈动态路由(by quqi99)
- Java 实现读取文件指定行
- 容斥原理 —— 不重不漏的计数
- Android BGABadgeView:新消息/未接来电/未读消息/新通知圆球红点提示(1)
- MyBatis学习总结(七)缓存
- 有容云:DevOps 的起点-入手微型数据中心(下)
- jQuery select操作
- 重新认识HashMap(in JDK1.8)