標籤:style os io for 代碼 c++ amp size
題意:給你一個數n,接下來給你一個矩形體的3邊長(即隨便你怎麼放它,它的高度有可能是3邊中的一條邊),現在要你求出這n個矩形體能堆成一座塔的最高高度(塔就是面積從店面開始向上嚴格遞增)
思路:動規裡的最長子序列的變形,結合了貪心的思想。首先我們需要對你所用的高進行排序,排序之後找出最嚴格遞減的面積就可以了
AC代碼:
#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>using namespace std;struct node{ int l,w,h;}box[111];int dp[111];bool cmp(node a,node b){ if(a.l>b.l) return true; if(a.l==b.l&&a.w>b.w) return true; return false;}int main(){ int d[3],n,i,j,c=1,k,sumh;while(scanf("%d",&n)!=EOF&&n){ k=0;for(i=0;i<n;i++) { scanf("%d%d%d",&d[0],&d[1],&d[2]);sort(d,d+3);box[k].l=d[2];box[k].w=d[1];box[k].h=d[0];k++; //每個矩形體有3中放的方式box[k].l=d[2];box[k].w=d[0];box[k].h=d[1];k++;box[k].l=d[1];box[k].w=d[0];box[k].h=d[2];k++;}sort(box,box+k,cmp);/*for(i=0;i<k;i++) printf("%d %d %d\n",box[i].l,box[i].w,box[i].h);*/for(i=0;i<k;i++) dp[i]=box[i].h;for(i=k-2;i>=0;i--)for(j=i+1;j<k;j++){ if(box[i].l>box[j].l&&box[i].w>box[j].w) //尋求嚴格遞減的面積 if(dp[i]<dp[j]+box[i].h) dp[i]=dp[j]+box[i].h;} sumh=dp[0]; for(i=0;i<k;i++) if(sumh<dp[i]) sumh=dp[i]; printf("Case %d: maximum height = %d\n",c++,sumh);} return 0;}