您的位置:首页 > 其它

zoj-1093-Monkey and Banana

2013-09-04 22:21 369 查看
一道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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: