题目如下:
https://vjudge.net/problem/UVA-437
利用最长上升子序列的思想便可以解这道题
#include <iostream>
#include <algorithm>
#include <cstring>
#include <climits>
using namespace std;
struct node
{
int x;
int y;
int z;
};
bool cmp(node a,node b)
{
return a.x*b.y<b.x*b.y;
}
const int maxn=200;
int dp[maxn];
int main()
{
// freopen("data.in.txt","r",stdin);
int n,ncase=0;
while(cin>>n&&n){
node inf[maxn];
int a,b,c;
int num=0;
for(int i=0;i<n;i++){
cin>>a;
cin>>b;
cin>>c;
inf[num].x=a,inf[num].y=b,inf[num++].z=c;
inf[num].x=a,inf[num].y=c,inf[num++].z=b;
inf[num].x=b,inf[num].y=a,inf[num++].z=c;
inf[num].x=b,inf[num].y=c,inf[num++].z=a;
inf[num].x=c,inf[num].y=b,inf[num++].z=a;
inf[num].x=c,inf[num].y=a,inf[num++].z=b;
}
sort(inf,inf+num,cmp);
memset(dp,0,sizeof(dp));
int res=INT_MIN;
for(int i=0;i<num;i++)
dp[i]=inf[i].z;
for(int i=0;i<num;i++){
for(int j=0;j<i;j++){
if(inf[i].x>inf[j].x&&inf[i].y>inf[j].y)
dp[i]=max(dp[i],dp[j]+inf[i].z);
}
if(res<dp[i])
res=dp[i];
}
cout<<"Case "<<++ncase<<": maximum height = "<<res<<endl;
}
return 0;
}