您的位置:首页 > 其它

HDU 1069

2016-04-05 20:23 190 查看
#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,这个是需要考虑多个因素的最长递减子序列,题目比较花哨,容易让人心生畏惧,仍需要好好努力学习啊
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: