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); }}
新聞熱點
疑難解答