标签:
题意:有若干种不同规格(长、宽、高)的砖块,每种砖块有无数个,可以自由选择以砖块的哪条边做长、宽或高,用这些砖块搭高塔,要求上面砖块的长宽必须严格小于下面砖块的长宽,问塔最高能有多高
我的做法是每读入一组长宽高,就把它分为三种不同的、长宽高定好的砖块,全部读完之后将这些砖块依次按照长宽高排序,从长宽最大的砖块开始依次求以该砖块为顶的塔最高能有多高:
对于第 i 块砖,我想前寻找第一块长宽均比它大的砖块 j ,进行优化:
dp [ i ] = max ( dp [ i ] , dp [ j ] + p [ i ] . z ) ; p [ i ] . z 就是第 i 块砖的高度。
dp 完之后再遍历一遍寻找最大的高度,当然,其实在 dp 的过程中就可以进行最大值的选取了。
1 int main(){ 2 int d[4],n,c=0; 3 while(scanf("%d",&n)!=EOF&&n!=0){ 4 memset(dp,0,sizeof(dp)); 5 p[0].x=p[0].y=0xFFFFFFF; 6 p[0].z=0; 7 int i,j,count=0; 8 for(int q=1;q<=n;q++){ 9 scanf("%d%d%d",&d[1],&d[2],&d[3]); 10 for(i=1;i<=2;i++){ 11 for(j=i+1;j<=3;j++){ 12 if(d[i]<d[j]){ 13 int t=d[i]; 14 d[i]=d[j]; 15 d[j]=t; 16 } 17 } 18 } 19 p[++count].x=d[1]; 20 p[count].y=d[2]; 21 p[count].z=d[3]; 22 p[++count].x=d[1]; 23 p[count].y=d[3]; 24 p[count].z=d[2]; 25 p[++count].x=d[2]; 26 p[count].y=d[3]; 27 p[count].z=d[1]; 28 } 29 sort(p+1,p+count+1,cmp); 30 /* printf("\n"); 31 for(i=1;i<=count;i++){ 32 printf("%d %d %d\n",p[i].x,p[i].y,p[i].z); 33 } 34 printf("\n");*/ 35 for(i=1;i<=count;i++){ 36 37 for(j=i-1;j>=0;j--){ 38 39 if (p[i].x<p[j].x&&p[i].y<p[j].y){ 40 41 dp[i]=max(dp[i],dp[j]+p[i].z); 42 } 43 } 44 } 45 // for(i=1;i<=count;i++)printf("%d %d\n",i,dp[i]); 46 int ans=0; 47 for(i=1;i<=count;i++){ 48 if(dp[i]>ans)ans=dp[i]; 49 } 50 printf("Case %d: maximum height = %d\n",++c,ans); 51 } 52 return 0; 53 }
标签:
原文地址:http://www.cnblogs.com/cenariusxz/p/4290367.html