zoj1093

此题很久以前就看到了,也知道是求最大上升子序列,但就是不会求,笨啊,相信各位都做过矩阵嵌套吧,哎。。。。就多一维,加一个二级排序,直接套用不就行了,哎,。。。笨。。

 

时间不多了,马上要停电了,来不及优化了,凑合着看吧,。。。死长死长的。。

 

#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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值