最大递增子序列变形——二维带权值 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; }

你可能感兴趣的:(HDU)