标签:
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 12865 Accepted Submission(s): 6757
#include<iostream> #include<stdio.h> #include<algorithm> using namespace std; const int maxn = 30*4; int num=0; struct Node { int len,wid; int hei; } rect[maxn]; int dp[maxn]; void add(int t[],int sta) { if(sta==0) { rect[num].len=max(t[1],t[2]); rect[num].wid= min(t[1],t[2]); rect[num].hei=t[0]; num++; return; } if(sta==1) { rect[num].len=max(t[0],t[2]); rect[num].wid= min(t[0],t[2]); rect[num].hei=t[1]; num++; return; } rect[num].len=max(t[0],t[1]); rect[num].wid= min(t[0],t[1]); rect[num].hei=t[2]; num++; } bool cmp(Node a,Node b) { if(a.len!=b.len) return a.len<b.len; if(a.wid!=b.wid) return a.wid<b.wid; return a.hei>b.hei; } int main() { int n; int cas=1; while(~scanf("%d",&n)&&n) { num=0; for(int i=0;i<n;i++) { int t[4]; for(int k=0;k<3;k++) scanf("%d",t+k); for(int k=0;k<3;k++) add(t,k); } int maxx = -1; sort(rect,rect+num,cmp); for(int i=0;i<num;i++) dp[i]=rect[i].hei; for(int i=1;i<num;i++) { for(int j=i-1;j>=0;j--) { if(rect[i].len>rect[j].len&&rect[i].wid>rect[j].wid) { dp[i]=max(dp[i],dp[j]+rect[i].hei); } } maxx=max(dp[i],maxx); } printf("Case %d: maximum height = %d\n",cas++,maxx); } return 0; }
dp[i]表示 以i为最下面的箱子,可以得到的最大高度。
在判断第i的时候,由于箱子已经按照 base dimensions (也就是长和宽)从小到大递增,所以只能把第i个箱子放在前i-1个箱子的某一个下面
(这里便是dp数组循环所做的事情)
这样,从第一个箱子(以为第一个箱子上面不肯能在放其他的箱子,所以我们直接从第二个箱子开始)循环,每次记录最大值,
最后按照样例格式输出即可。
标签:
原文地址:http://www.cnblogs.com/superxuezhazha/p/5792691.html