题目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)。