首页 > 代码库 > hdu 1068 最大子序列和变形,,,

hdu 1068 最大子序列和变形,,,

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 200
using namespace std;
struct node
{
    int x,y,z;
};
int cmp(node a,node b)
{
    if(a.x==b.x) return a.y<b.y;
    return a.x<b.x;
}
int mymax(int x,int y)
{
    if(x>y) return x;
    return y;
}
int main()
{
    int n;
    int Case=0;
    while(cin>>n&&n)
    {
        node fuck[maxn];
        int dp[maxn];
        memset(dp,0,sizeof(dp));
        int ret=0;
        while(n--)
        {
            int x,y,z;
            cin>>x>>y>>z;
            fuck[ret].x=x,fuck[ret].y=y,fuck[ret++].z=z;
            fuck[ret].x=x,fuck[ret].y=z,fuck[ret++].z=y;
            fuck[ret].x=y,fuck[ret].y=x,fuck[ret++].z=z;
            fuck[ret].x=y,fuck[ret].y=z,fuck[ret++].z=x;
            fuck[ret].x=z,fuck[ret].y=x,fuck[ret++].z=y;
            fuck[ret].x=z,fuck[ret].y=y,fuck[ret++].z=x;
        }
        sort(fuck,fuck+ret,cmp);
        dp[0]=fuck[0].z;
        for(int i=1;i<ret;i++)
        {
            dp[i]=fuck[i].z;
            for(int j=0;j<i;j++)
            {
                if(fuck[j].x<fuck[i].x&&fuck[j].y<fuck[i].y)
                {
                    dp[i]=mymax(dp[i],dp[j]+fuck[i].z);
                }
            }
        }
        //这里的dp只是算出了每个i对应的值 并没有算出最大的
        int zz=dp[0];
        for(int i=1;i<ret;i++) if(zz<dp[i]) zz=dp[i];
        printf("Case %d: maximum height = %d\n",++Case,zz);
    }
    return 0;
}

hdu 1068 最大子序列和变形,,,