zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    Vault插件示例--Vault Explorer与Thin Client的集成。
    什么是REST?
    Android Tips: 打电话和发短信
    使用Autodesk Vault插件向导轻松创建Vault插件
    智者当借力而行, 借助Autodesk应用程序商店实现名利双收
    MapGuide Maestro 5.1发布了
    ArcGIS ElementLayer上放置Windows控件
    ArcGIS图层和要素的过滤显示
    ArcGIS中的三种查询
    ArcGIS图层介绍
  • 原文地址:https://www.cnblogs.com/crazyapple/p/3011052.html
Copyright © 2011-2022 走看看