HDU 1069

来源:互联网 发布:搜索引擎优化外包 编辑:程序博客网 时间:2024/06/05 09:31
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn=1000;typedef struct name{    int a,b,c;}cube;int n,d[3];int dp[maxn];cube maze[maxn];int cmp(cube x,cube y){    if(x.a>y.a) return 1;    if(x.a==y.a&&x.b>y.b) return 1;    return 0;}int main(){    int k,sum,kase=1;    while(scanf("%d",&n)!=EOF&&n!=0)    {        k=0;        for(int i=0;i<n;i++)        {            scanf("%d%d%d",&d[0],&d[1],&d[2]);            sort(d,d+3);            maze[k].a=d[2];maze[k].b=d[1];maze[k].c=d[0];k++;            maze[k].a=d[2];maze[k].b=d[0];maze[k].c=d[1];k++;            maze[k].a=d[1];maze[k].b=d[0];maze[k].c=d[2];k++;        }        sort(maze,maze+k,cmp);       /* for(int i=0;i<k;i++)            printf("%d  %d   %d\n",maze[i].a,maze[i].b,maze[i].c);*/        for(int i=0;i<k;i++)            dp[i]=maze[i].c;         for(int i=k-2;i>=0;i--)         {             for(int j=i+1;j<k;j++)             {                 if(maze[i].a>maze[j].a&&maze[i].b>maze[j].b)                 {                     if(dp[i]<dp[j]+maze[i].c)                        dp[i]=dp[j]+maze[i].c;                 }             }         }         sum=dp[0];         for(int i=0;i<n;i++)         {             if(sum<dp[i])                sum=dp[i];         }         printf("Case %d: maximum height = %d\n",kase++,sum);    }    return 0;}
忏愧啊,这个题完全是看别人的解题报告才明白的,这个题不同于以往我做的一些DP,这个是需要考虑多个因素的最长递减子序列,题目比较花哨,容易让人心生畏惧,仍需要好好努力学习啊
0 0
原创粉丝点击