zoukankan      html  css  js  c++  java
  • 矩形嵌套(DP)

    矩形嵌套

    时间限制:3000 ms  |  内存限制:65535 KB
    难度:4
    描述
    有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(0<N<10),表示测试数据组数,
    每组测试数据的第一行是一个正正数n,表示该组测试数据中含有矩形的个数(n<=1000)
    随后的n行,每行有两个数a,b(0<a,b<100),表示矩形的长和宽
    输出
    每组测试数据都输出一个数,表示最多符合条件的矩形数目,每组输出占一行
    样例输入
    1
    10
    1 2
    2 4
    5 8
    6 10
    7 9
    3 1
    5 8
    12 10
    9 7
    2 2
    样例输出
    5
    题解:
    DAG(有向无环图)模型题
    先将矩形的长宽储存在结构体中,使短的边放在x,长的边放在y,然后进从小到大排序
    但是该排序不能保证后一个矩形不能大于前一个矩形,所以还要进行遍历判断。
    该题的主要是判断的地方,即当前的矩形是否大于之前比较过的矩形,(比较长宽)
     即(s[i].x > s[j].x) && (s[i].y > s[j].y) 
    如果当前的矩形大于另一个矩形
    则更新dp[i]的值
    最后遍历找出最大的值
     1 #include <iostream>
     2 #include <cstdio>
     3 #include <algorithm>
     4 #include <cmath>
     5 using namespace std;
     6 
     7 int dp[1100];
     8 struct node{
     9     int x,y;
    10 }s[1100];
    11 bool cmp(node a, node b)
    12 {
    13     if(a.x == b.x) return a.y < b.y;
    14     return a.x < b.x;
    15 }
    16 void init(int n)
    17 {
    18     for(int i = 0; i <= n; i++)
    19         dp[i] = 1;
    20 }
    21 int main()
    22 {
    23     int t;
    24     int n, a, b;
    25     while(scanf("%d",&t) != EOF)
    26     {
    27         while(t--) {
    28             scanf("%d",&n);
    29             for(int i = 0; i < n; i++)//存边
    30             {
    31                 scanf("%d%d",&a,&b);
    32                 if(a > b) {s[i].x = b, s[i].y = a;}
    33                 else {s[i].x = a, s[i].y = b;}
    34             }
    35             init(n);
    36             sort(s, s+n, cmp);
    37             for(int i = 1; i < n; i++)
    38                 for(int j = 0; j < i; j++)
    39                 if( (s[i].x > s[j].x) && (s[i].y > s[j].y) )
    40             {
    41                 if(dp[i] < (dp[j]+1))//如果当前的矩形大于另一个矩形,更新dp[i]的值
    42                     dp[i] = dp[j]+1;
    43             }
    44             int ans = 0;
    45             for(int i = 0; i < n; i++)//找出最大的值
    46                 if(dp[i] > ans)
    47                     ans = dp[i];
    48             printf("%d
    ",ans);
    49         }
    50 
    51     }
    52     return 0;
    53 }
  • 相关阅读:
    SQL语句获取数据库名、表名、储存过程以及参数列表 狼
    CKEditor3.3+CKFinder2.0附带CKF去除水印 狼
    media player 和realplayer 编程接口 狼
    教您如何去认识人!(识人术) 狼
    引用 JS判断浏览器类型方法 狼
    (转)初始化多维数组
    kmeans 聚类 (代码为: 博客数据聚类) (python )
    对博客订阅源URL中的单词进行计数 (仅限英文博客,中文订阅源不支持 )
    eclipse +python 修改 各种颜色 +字体
    常见错误收集: lucene 读取word文档问题
  • 原文地址:https://www.cnblogs.com/creativepower/p/7324575.html
Copyright © 2011-2022 走看看