noj 1414 (宁波) Rectangular Parallelopiped(sort+dp)

  • http://ac.nbutoj.com/Problem/view.xhtml?id=1414
  • [1414] Rectangular Parallelopiped

  • 时间限制: 1000 ms 内存限制: 65535 K
  • 问题描述
  • 有n个长方体,每个长方体可以用a,b,c来描述,表示长和宽。长方体(a,b,c)(a<=b<=c)可以嵌套在长方体(x,y,z)(x<=y<=z)内当且仅当a<x,b<y,c<z。例如(1,5,6)可以嵌套在(2,7,8)内,但不能嵌套在(1,2,30)内。你的任务是选出尽可能多的长方体排成一行,使得除最后一个外,每个长方体都可以嵌套在下一个长方体内。
  • 输入
  • 每组测试数据的第一行是一个正整数n,表示该组测试数据中含有长方体的个数(n<=1000)。 随后的n行,每行有三个数a,b,c(0<a,b,c<100),表示长方体的长和宽和高。
  • 输出
  • 每组测试数据都输出一个数,表示最多符合条件的长方体数目,每组输出占一行。
  • 样例输入
  • 4
    1 1 1
    1 2 1
    2 2 2
    3 5 4
    
  • 样例输出
  • 3
  • 题解思路:
  • 先按照题目意思将输入变成a<=b<=c的形式;
  • 然后按照a的大小进行排序;
  • 排完序后对得到序列进行dp,即最长递增子序列,动态转移方程为dp[j]=max{dp[1~j-1]}+1,max中条件为x>a&&y>b&&z>c
  • 代码:c++
  •  1 #include<iostream>
     2 #include<stdio.h>
     3 #include<math.h>
     4 #include<algorithm>
     5 #include<string.h>
     6 #include<string>
     7 #include<ctime>
     8 #include<queue>
     9 #include<list>
    10 #include<map>
    11 #include<set>
    12 #define INF 999999999
    13 #define MAXN 10000000
    14 using namespace std;
    15 struct Nod
    16 {
    17     int a[5];
    18 }node[1010];
    19 
    20 int cmp(Nod aa,Nod bb)
    21 {
    22     return aa.a[0]<bb.a[0];
    23 }
    24 
    25 int comp(Nod aa,Nod bb)
    26 {
    27     if(aa.a[0]<bb.a[0]&&aa.a[1]<bb.a[1]&&aa.a[2]<bb.a[2])
    28         return 1;
    29     return 0;
    30 }
    31 
    32 int main()
    33 {
    34     int n;
    35     while(~scanf("%d",&n))
    36     {
    37         int i;
    38         for(i=0;i<n;i++)
    39         {
    40             scanf("%d%d%d",&node[i].a[0],&node[i].a[1],&node[i].a[2]);
    41             sort(node[i].a,node[i].a+3);
    42         }
    43         sort(node,node+n,cmp);
    44         int dp[1010];
    45         memset(dp,0,sizeof(dp));
    46         int j,maks,temp=-1;
    47         dp[0]=1;
    48         for(i=1;i<n;i++)
    49         {
    50             maks=0;
    51             for(j=0;j<i;j++)
    52             {
    53                 if(maks<dp[j]&&comp(node[j],node[i]))
    54                 {
    55                     maks=dp[j];
    56                 }
    57             }
    58             dp[i]=maks+1;
    59             if(temp<dp[i])
    60                 temp=dp[i];
    61         }
    62         printf("%d\n",temp);
    63     }
    64     return 0;
    65 }
原文地址:https://www.cnblogs.com/crazyapple/p/3011052.html