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

#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;
}
原文地址:https://www.cnblogs.com/wsruning/p/4668311.html