您的位置:首页 > 其它

最大递增子序列变形——二维带权值 O(n*n) HDU1069

2015-07-22 18:55 441 查看
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

int tmp[30][3];
int dp[100];

class Node
{
public:
int x;
int y;
int h;
bool operator <(const Node&n) const
{
if(x==n.x)
return y<n.y;
else
return x<n.x;
}
};

Node arr[100];
int se[100][2];

int main()
{
int n;
int sign=0;
while(cin>>n&&n!=0)
{
sign++;
int num=0;
memset(dp,0,sizeof(dp));
for(int i=0;i<n;i++)
{
cin>>tmp[i][0]>>tmp[i][1]>>tmp[i][2];
sort(tmp[i],tmp[i]+3);
arr[num].x=tmp[i][2];
arr[num].y=tmp[i][1];
arr[num].h=tmp[i][0];
num++;
arr[num].x=tmp[i][1];
arr[num].y=tmp[i][0];
arr[num].h=tmp[i][2];
num++;
arr[num].x=tmp[i][2];
arr[num].y=tmp[i][0];
arr[num].h=tmp[i][1];
num++;
}
sort(arr,arr+num);
for(int i=0;i<num;i++)
{
dp[i]=arr[i].h;
for(int j=0;j<i;j++)
if(arr[i].x>arr[j].x&arr[i].y>arr[j].y)
dp[i]=max(dp[j]+arr[i].h,dp[i]);
}
int mi=0;
for(int i=0;i<num;i++)
{
if(mi<dp[i])
mi=dp[i];
}
cout<<"Case "<<sign<<": maximum height = "<<mi<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: