- 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/archive/2013/04/09/3011052.html