简单DP #include<iostream> #include<vector> #include<algorithm> using namespace std; struct point { int x; int y; int value; int wi; }mp[10000]; int cmp(point a,point b) { if(a.x==b.x)return a.y<b.y; return a.x<b.x; } int main() { int T,ca=0,a[3],np,i,j,key,nx,ny; point uu; while(1) { np=0; scanf("%d",&T); if(T==0)break; for(i=0;i<T;i++) { scanf("%d%d%d",&a[0],&a[1],&a[2]); sort(a,a+3); mp[np].x=a[0]; mp[np].y=a[1]; mp[np].value=a[2]; np++; if(a[2]!=a[1]&&a[0]!=a[1]) { mp[np].x=a[1]; mp[np].y=a[2]; mp[np].value=a[0]; np++; } if(a[1]!=a[2]) { mp[np].x=a[0]; mp[np].y=a[2]; mp[np].value=a[1]; np++; } } sort(mp,mp+np,cmp); for(i=0;i<np;i++) mp[i].wi=mp[i].value; for(i=0;i<np;i++) { for(j=i+1;j<np;j++) { if(mp[i].x<mp[j].x&&mp[i].y<mp[j].y&&mp[j].wi<mp[i].wi+mp[j].value) { mp[j].wi=mp[i].wi+mp[j].value; } } } key=0; for(i=0;i<np;i++) { if(key<mp[i].wi) key=mp[i].wi; } printf("Case %d: maximum height = %d/n",++ca,key); } return 0; }