110 20 3026 8 105 5 571 1 12 2 23 3 34 4 45 5 56 6 67 7 7531 41 5926 53 5897 93 2384 62 6433 83 270样例输出Case 1: maximum height = 40Case 2: maximum height = 21Case 3: maximum height = 28Case 4: maximum height = 342题意:
把给定的长方体(不限)叠加在一起,叠加的条件是,上面一个长方体的长和宽都比下面长方体的长
和宽短;求这些长方体能叠加的最高的高度.(其中(3,2,1)可以摆放成(3,1,2)、(2,1,3)等).
PS:每块积木最多有3 个不同的底面和高度,我们可以把每块积木看成三个不同的积木,那么n种类型的积木就转化为3*n个不同的积木,对这3* n个积木的长按照从大到小排序;然后找到一个递减的子序列,使得子序列的高度和最大。#include<stdio.h>#include<iostream>#include<algorithm>#include<string.h>using namespace std;struct node{ int q,w,e;}a[10000];int dp[10000];bool cmp(node a,node b){ if(a.q!=b.q) return a.q>b.q; else return a.w>b.w;}int main(){ int n; int g=0; while(scanf("%d",&n)!=-1) { memset(dp,0,sizeof(dp)); if(n==0) break; ++g; int p=0; int z,x,c; int ha[4]; for(int i=0;i<n;i++) { scanf("%d%d%d",&ha[0],&ha[1],&ha[2]); sort(ha,ha+3); a[p].q=ha[0]; a[p].w=ha[1]; a[p].e=ha[2]; p++; a[p].q=ha[0]; a[p].w=ha[2]; a[p].e=ha[1]; p++; a[p].q=ha[1]; a[p].w=ha[2]; a[p].e=ha[0]; p++; } sort(a,a+p,cmp); int sum=0; int maxn=0; for(int i=0;i<p;i++) {dp[i]=a[i].e; for(int j=i;j>=0;j--) { if(a[j].q>a[i].q&&a[j].w>a[i].w) { dp[i]=max(dp[i],dp[j]+a[i].e); } } if(dp[i]>maxn) { maxn=dp[i]; } } printf("Case %d: maximum height = ",g); printf("%d/n",maxn); }}
新闻热点
疑难解答