一道DP题,不过在给元素排序时需要注意。
/*
ID:slowlight
PROG:Monkey and Banana
LANG:C++
DATE:2013-9-4
*/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <vector>
#include <set>
#include <algorithm>
using namespace std;
typedef struct{
int a;
int b;
}Rect;
typedef struct{
Rect base;
int height;
}Brick;
bool operator < ( const Brick & a, const Brick & b)
{
Rect b_base = b.base;
Rect base = a.base;
if( base.a < b_base.a && base.b < b_base.b ||
base.a < b_base.b && base.b < b_base.a )
return true;
else
return false;
};
bool cmp(const Brick & a, const Brick & b)
{
return a.base.b < b.base.b;
}
Brick d[100];
int f[100];
int main()
{
freopen("input.in", "r", stdin);
freopen("output.out", "w", stdout);
int N;
int case_cnt = 0;
int a, b, c;//3 edges of the brick
cin >> N;
case_cnt = 1;
do
{
int max_height = 0;
int cnt = 0;
while( N-- )
{
cin >> a >> b >> c;
Rect rect;
rect.a = min(a, b);
rect.b = max(a, b);
d[cnt].base = rect;
d[cnt++].height = c;
rect.a = min(a, c);
rect.b = max(a, c);
d[cnt].base = rect;
d[cnt++].height = b;
rect.a = min(b, c);
rect.b = max(b, c);
d[cnt].base = rect;
d[cnt++].height = a;
}
sort(d, d + cnt, cmp);
int size = cnt;
for(int i=0;i<size;i++)
f[i] = d[i].height;
for(int i=0;i<size;i++)
for(int j=0;j<i;j++)
if( d[j] < d[i] )
{
int temp;
temp = d[i].height + f[j];
if( temp > f[i] )
f[i] = temp;
}
for(int i=0;i<size;i++)
if( f[i] > max_height )
max_height = f[i];
cout << "Case " << case_cnt <<": maximum height = " << max_height << endl;
cin >> N;
case_cnt++;
}while( N );
return 0;
}