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

    矩形嵌套

    时间限制: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
     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<stdlib.h>
     4 #define N 1100
     5 
     6 int G[N][N];
     7 int n,max;
     8 int ans[N];
     9 int d[N];
    10 typedef struct
    11 {
    12     int l,w;
    13 } s;
    14 s r[N];
    15 int f(int);
    16 
    17 /*
    18 void print_ans(int t,int count)
    19 {
    20     int i,j;
    21     if(count==1)
    22     {
    23         max=0;
    24         for(i=1; i<=n; i++)
    25             max=max<d[i]?d[i]:max;
    26         for(i=1; i<=n; i++)
    27         {
    28             if(d[i]==max)
    29             {
    30                 ans[count]=i;
    31                 print_ans(i,count+1);
    32             }
    33         }
    34     }
    35     else if(count>max)
    36     {
    37         for(i=1; i<=max; i++)
    38             printf("%d%c",ans[i],i==max?'
    ':' ');
    39         puts("
    *************************
    ");
    40     }
    41     else
    42     {
    43         for(j=1; j<=n; j++)
    44         {
    45             if(G[t][j]&&d[t]==d[j]+1)
    46             {
    47                 ans[count]=j;
    48                 print_ans(j,count+1);
    49             }
    50         }
    51     }
    52 }
    53 */
    54 
    55 int main(void)
    56 {
    57     int i,j,t;
    58     scanf("%d",&t);
    59     while(t--)
    60     {
    61         scanf("%d",&n);
    62         memset(G,0,sizeof(G));
    63         memset(d,0,sizeof(d));
    64         for(i=1; i<=n; i++)
    65         {
    66             scanf("%d%d",&(r+i)->l,&(r+i)->w);
    67         }
    68         for(i=1; i<=n; i++)
    69             for(j=1; j<=n; j++)
    70             {
    71                 if(i-j)
    72                 {
    73                     if((r[i].l<r[j].l&&r[i].w<r[j].w)||(r[i].l<r[j].w&&r[i].w<r[j].l))
    74                         G[i][j]=1;
    75                 }
    76             }
    77             for(i=1;i<=n;i++)
    78                 f(i);
    79        long long max=0;
    80        for(i=1;i<=n;i++)
    81         max=max<d[i]?d[i]:max;
    82        printf("%I64d
    ",max);
    83     }
    84     return 0;
    85 }
    86 
    87 int f(int i)
    88 {
    89     int j;
    90     int ans=d[i];
    91     if(ans>0)
    92         return ans;
    93     ans=1;
    94     for(j=1; j<=n; j++)
    95         if(G[i][j])
    96             ans=ans<(f(j)+1)?(f(j)+1):ans;
    97     return d[i]=ans;
    98 }

    题目分析:先将各组长方形的边长用结构数组存起来,然后用邻接矩阵将各长方形的嵌套关系存起来,构成一个有向无环图,由于没有规定起点,所以任何一个长方形都可作为初始状态,遍历各个节点,求出d[i],其中d[i]表示从第i个节点出发的最大长度,d[i]=max(d[j]+1)(G[i][j]为1),然后最优解为max(d[i]).函数f(int i)利用ans对d[i]形成一个引用,应当注意。
  • 相关阅读:
    EF之Model First
    easyui报错 Cannot read property 'length' of null
    EF迁移报错An operation was scaffolded that may result in the loss of data. Please review the migration for accuracy.
    Vue脚手架搭建
    [LeetCode No.20] 有效的括号
    爬虫-给女朋友的每日天气预报
    [LeetCode No.316] 去除重复字母
    [LeetCode No.738] 单调递增的数字
    [LeetCode No.49] 字母异味词分组
    [LeetCode No.34] 在排序数组中查找元素的第一个和最后一个位置
  • 原文地址:https://www.cnblogs.com/rootial/p/3192464.html
Copyright © 2011-2022 走看看