• DAG模型(矩形嵌套)


    推荐在线例题:http://acm.nyist.net/JudgeOnline/problem.php?pid=16

    题摘:

    矩形嵌套

    时间限制: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

    Print1是按照题目要求输出最多矩形数
    Print2是把选择的矩形都输出


    #include"iostream"
    #include"cstdio"
    #include"cstring"
    #include"algorithm"
    using namespace std;
    #define maxn 100
    
    int n,Max;
    
    int dp[maxn];
    
    struct  node
    {
    int l,w;
    }mat[maxn];
    
    bool cmp(node a,node b)
    {
        if(a.l!=b.l) return a.l<b.l;
        return a.w<b.w;
    }
    
    int max(int a,int b)
    {
        return a>b?a:b;
    }
    
    void swap(int &a,int &b)
    {
        int t;
        t=a;
        a=b;
        b=t;
    }
    
    void Init()
    {
      cin>>n;
      int tl,tw;
      for(int i=1;i<=n;i++)
      {
         scanf("%d%d",&tl,&tw);
         if(tl<tw) swap(tl,tw);
         mat[i].l=tl;mat[i].w=tw;
      }
      memset(dp,0,sizeof(dp));
    }
    
    void Work()
    {
       sort(mat+1,mat+1+n,cmp);
       Max=-1;
       for(int i=1;i<=n;i++)
       {
           for(int j=1;j<=i;j++)
           {
              if(mat[i].l>mat[j].l&&mat[i].w>mat[j].w)
              {
                  dp[i]=max(dp[i],dp[j]+1);
              }
           }
           dp[i]=max(dp[i],1);
           Max=max(Max,dp[i]);
       }
    }
    
    void Print1()
    {
    printf("%d
    ",max(1,Max));
    }
    
    void Print2(int i)
    {
    printf("%d ",i);
    for(int j=1;j<=n;j++) if(dp[i]==dp[j]+1&&mat[i].l>mat[j].l&&mat[i].w>mat[j].w) {Print2(j);break;}
    }
    
    int main()
    {
        int T;
        cin>>T;
        while(T--)
        {
          Init();
          Work();
          Print1();
          //Print2(n);cout<<endl;
        }
        return 0;
    }
    1
  • 相关阅读:
    Linux 禁用笔记本触摸板
    Linux 下安装android
    关于JAVA多线程的那些事__初心者
    ADT下开发环境的配置--个人配置啦 Eclipse Color Themes
    关于权限系统的一些思考
    关于线程安全的单例模式的讨论
    说下Fedora下把SpiderMonkey放入Eclipse内编译的过程
    基于Eclipse构建Hadoop源码阅读环境
    Hadoop生态上几个技术的关系与区别:hive、pig、hbase 关系与区别
    CentOS6.5安装配置
  • 原文地址:https://www.cnblogs.com/zsyacm666666/p/4735030.html
Copyright © 2020-2023  润新知