分析:最长子序列的变种;另外长方体可以有三种放法,三种放法都存在同一个数组里面,因为每种长方体可以有无限个。
#include<iostream> #include<algorithm> using namespace std; struct BOX { int x,y,z; } box[100]; int dp[100]; bool cmp(BOX a,BOX b) { if(a.x>b.x) return true; else if(a.x==b.x && a.y>b.y) return true; else return false; } int main() { int n,i,k,j,max,T; int tmp[4]; T=0; while(cin>>n && n) { k=0; for(i=0;i<n;i++) { cin>>tmp[0]>>tmp[1]>>tmp[2]; sort(tmp,tmp+3); //每种盒子有三种放法 box[k].x=tmp[2]; box[k].y=tmp[1]; box[k++].z=tmp[0]; box[k].x=tmp[2]; box[k].y=tmp[0]; box[k++].z=tmp[1]; box[k].x=tmp[1]; box[k].y=tmp[0]; box[k++].z=tmp[2]; } sort(box,box+k,cmp); memset(dp,0,sizeof(dp)); max=0; for(i=0;i<k;i++) { dp[i]=box[i].z; max=max>dp[i]?max:dp[i]; for(j=0;j<i;j++) if(box[j].x>box[i].x && box[j].y>box[i].y) dp[i]=dp[i]>dp[j]+box[i].z?dp[i]:dp[j]+box[i].z; max=max>dp[i]?max:dp[i]; } cout<<"Case "<<++T<<": maximum height = "<<max<<endl; } return 0; }
HDU ACM 1069 Monkey and Banana->动态规划
原文地址:http://blog.csdn.net/a809146548/article/details/45392951