标签:int turn return col 开始 i++ 一起 最大 ret
题意:把给定的长方体(不限个数)叠加在一起,要求上面一个长方体的长和宽都比下面长方体的小,求这些长方体能叠加的最高的高度.(其中(3,2,1)可以摆放成(3,1,2)、(2,1,3)等)。
思路:其实就是求最长的单调递减序列。在长和宽的递减下,求最大能得出的最大高度了。
1 #include<iostream> 2 #include<stdio.h> 3 #include<string.h> 4 #include<algorithm> 5 #include<math.h> 6 using namespace std; 7 8 struct block{ 9 int x,y,z; 10 }a[100]; 11 12 bool cmp(block a,block b) 13 { 14 if(a.x>b.x) 15 return true;//按横坐标由大到小排序 16 if(a.x==b.x&&a.y>b.y) return true;//按 纵坐标排序 17 return false; 18 } 19 20 int dp[100]={0}; 21 22 int main() 23 { 24 int n,d[3],t=1; 25 while(cin>>n) 26 { 27 if(n==0) break; 28 // memset(a,0,sizeof(a)); 29 int k=0; 30 for(int i = 0;i< n ;i++) 31 { 32 cin>>d[0]>>d[1]>>d[2];//??为什么排序 ?不排序会WA, 33 sort(d,d+3); 34 a[k].x=d[2];a[k].y=d[1];a[k].z=d[0];k++;//保持x为底边最小边 便于排序后比较。,高分别取三个不同值 35 a[k].x=d[2];a[k].y=d[0];a[k].z=d[1];k++; 36 a[k].x=d[1];a[k].y=d[0];a[k].z=d[2];k++; 37 } 38 sort(a,a+k,cmp); 39 for(int i =0; i < k ;i++)dp[i]=a[i].z; 40 for(int i = k-1;i >= 0;i--) //看的题解是k-2,可是我觉得是k-1,不过两个都AC了 41 { //上面是从大到小排序,这里从最小开始遍历 42 for(int j = i+1;j<k;j++) 43 { 44 if(a[i].x>a[j].x&&a[i].y>a[j].y)//最长递减序列和 45 if(dp[i]<dp[j]+a[i].z) 46 dp[i]=dp[j]+a[i].z; 47 } 48 } 49 int ans =dp[0]; 50 for(int i=0;i<k;i++) 51 { 52 if(ans<dp[i])ans=dp[i]; 53 } 54 printf("Case %d: maximum height = %d\n",t,ans); 55 t++; 56 } 57 return 0; 58 }
标签:int turn return col 开始 i++ 一起 最大 ret
原文地址:https://www.cnblogs.com/lyqf/p/9770024.html