题目16:矩形嵌套
来源:互联网 发布:数控铣创意图案编程 编辑:程序博客网 时间:2024/05/18 00:15
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=16
描述
有n个矩形,每个矩形可以用a,b来描述,表示长和宽。矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a小于c,b小于d或者b小于c,a小于d(相当于旋转X90度)。例如(1,5)可以嵌套在(6,2)内,但不能嵌套在(3,4)中。你的任务是选出尽可能多的矩形排成一行,使得除最后一个外,每一个矩形都可以嵌套在下一个矩形内。
输入
第一行是一个正正数N(N<10且N>0),表示测试数据组数,
每组测试数据的第一行是一个正正数n,表示该组测试数据中含有矩形的个数(n<=1000)
随后的n行,每行有两个数a,b,表示矩形的长和宽
输出
每组测试数据都输出一个数,表示最多符合条件的矩形数目,每组输出占一行
样例输入
1
10
1 2
2 4
5 8
6 10
7 9
3 1
5 8
12 10
9 7
2 2
样例输出
5
算法思想:
这个题目是个典型的动态规划算法。可以将这个题目转换成一个LIS(单调递增子序列问题),前提是自己写一个比较函数,定义矩形A小于B为矩形A可以嵌套在矩形B中,故当A.a小于B.a且A.b小于B.b或A.a小于B.b且A.b小于B.a时,A小于B。定义好这个函数时就转换成LIS问题。列出递推公式如下:
其中c[i]记录的是长度为i时的最大单调递增子序列的长度,a[k]记录的是序列的第k个元素。
其中,这个自定义的大小函数很重要,在很多场合能够将问题进行转换,可以达到化繁为简的效果。
源代码
#include <iostream>#include <vector>#include <algorithm>#include <cstring>using namespace std;int dp[110];struct RECT{ int a; int b;};vector<RECT> vec;/*为排序预处理写的一个比较函数*/bool less_cmp(const RECT &x, const RECT &y){ return x.a < y.a;}/*自定义的一个比较矩阵大小的函数,将矩阵嵌套转换为比较大小*/bool rect_greater(const RECT &x,const RECT &y){ if (x.a > y.a && x.b > y.b || x.a > y.b && x.b > y.a) return true; else return false;}int main(){ int N, n, a, b, result; RECT rect; cin >> N; while (N--) { vec.clear(); cin >> n; int temp = n; while (temp--) { cin >> a >> b; rect.a = max(a,b); rect.b = min(a,b); vec.push_back(rect); } //排序预处理 sort(vec.begin(),vec.end(),less_cmp); //动态规划过程 for (int i = 0; i < (int)vec.size(); i++) { dp[i] = 1; for (int j = 0; j < i; j++) { if (rect_greater(vec[i],vec[j]) && dp[j] + 1 > dp[i]) { dp[i] = dp[j] + 1; } } } result = 0; for (int i = 0; i < n; i++) { result = max(result,dp[i]); } cout << result << endl; } return 0;}
算法复杂度
有两层循环,所以算法时间复杂度为O(n^2)。
- 题目16: 矩形嵌套
- 题目16:矩形嵌套
- 南阳理工OJ_题目16 矩形嵌套
- NYOJ 16 矩形嵌套
- nyoj 16 矩形嵌套
- 矩形嵌套 南工16
- NYOJ 16 矩形嵌套
- nyoj 16 矩形嵌套
- nyoj-16-矩形嵌套
- NYOJ 16 矩形嵌套
- NYOJ 16 矩形嵌套
- 嵌套矩形(nyoj 16)
- 矩形嵌套(nyoj 16)
- NYOJ 16 矩形嵌套
- NYOJ 16 矩形嵌套
- nyoj 16 矩形嵌套
- NYOJ 16 矩形嵌套
- NYOJ-16-矩形嵌套
- It is not safe to rely on the system's timezone settings. You are *required*
- centos 源码安装 apache2.4
- 测试之美
- OpenGL实现图片边缘暗角效果(1)
- Java ——guava-libraries
- 题目16:矩形嵌套
- Qt网络编程--HTTP服务器(三))
- OkHttp封装类
- 把科学计数法转成字符串
- Java 面向对象 多态
- linux kernel makefile 中 $(Q)的意思
- Linux 0.12 startup汇编代码的编译
- Qt网络编程--HTTP服务器(四)
- 爬虫与反爬虫之间的战争