此题很久以前就看到了,也知道是求最大上升子序列,但就是不会求,笨啊,相信各位都做过矩阵嵌套吧,哎。。。。就多一维,加一个二级排序,直接套用不就行了,哎,。。。笨。。
时间不多了,马上要停电了,来不及优化了,凑合着看吧,。。。死长死长的。。
#include <iostream>
#include <cstdlib>
#include <cstring>
#define SWAP(x, y)\
x = x + y;\
y = x - y;\
x = x - y;
using namespace std;
void sort_lwh( int *b)
{
int k,l;
for( k = 1;k <= 3;++k )
for( int l = k+1;l <= 3;++l )
if( b[ k ] > b[ l ] )
{
int temp = b[ k ];
b[ k ] = b[ l ] ;
b[ l ] = temp;
}
}
void sort_leh(int *l,int *w,int *h,int n)
{
for( int i = 1;i <= n;++i )
{
for( int j = i+1;j <= n;++j )
{
if( l[ i ] > l[ j ] )
{
SWAP( l[ i ],l[ j ] );
SWAP( w[ i ],w[ j ] );
SWAP( h[ i ],h[ j ] );
}
}
}
}
void sort_weh( int *l,int *w,int *h,int n )
{
for( int i = 1;i <= n;++i )
{
for( int j = i+1;j <= n;++j )
{
if(l[ i ] == l[ j ] && w[ i ] > w[ j ])
{
SWAP( w[ i ],w[ j ] );
SWAP( h[ i ],h[ j ] );
}
}
}
}
int main(void)
{
int leh[100],weh[100],heh[100];
int n,a[4],index = 0,max;
while(cin >> n && n)
{
index ++;
int num = 0;
for(int i =1;i <= n;++i)
{
cin >> a[ 1 ] >> a[ 2 ] >> a[ 3 ];
sort_lwh(a);
leh[++num] = a[ 1 ];weh[num] = a[ 2 ];heh[num] = a[ 3 ]; // 1 ,2 ,3
leh[++num] = a[ 1 ];weh[num] = a[ 3 ];heh[num] = a[ 2 ]; // 1, 3, 2
leh[++num] = a[ 2 ];weh[num] = a[ 3 ];heh[num] = a[ 1 ]; // 2 ,3 ,1
}
sort_leh( leh,weh,heh,3*n );
sort_weh( leh,weh,heh,3*n );
int f[ 100 ];
f[ 1 ] = heh[ 1 ];
for( int i = 1; i <= 3*n;++i )
{
int temp = 0;
for( int j = 1;j < i;++j )
{
if( leh[ i ] > leh[ j ] && weh[ i ] > weh[ j ] && temp < f[ j ])
temp = f[ j ];
}
f[ i ] = temp + heh[ i ];
}
max = 0;
for( int i =1; i<= 3*n;++i )
{
if( f[ i ] > max )
max = f[ i ];
}
cout << "Case "<< index << ": maximum height = " << max << endl;
}
return 0;
}