题目:http://acm.hdu.edu.cn/showproblem.php?pid=1069
这一题够折磨人,这一题难度在dp中只是1难度值,害惨我了,不过也学到了不少东西
#include <iostream>
#include "algorithm"
using namespace std;
struct blocks
{
int x,y,z;
}jm[3*31];
int dp[3*31];
bool cmp(blocks a,blocks b)//这个sort排序要用到的东西,起初我是用指针的,汗,错死我了,我在想我到底应该怎样解决这类问题啊,找不到问题,思路又没有问题,在一边干着急,汗汗汗~~~走过路过别忘了帮忙解决一下这类问题啊……还是南柯帮得忙啊~~~谢谢你啦^_^
{
if(a.x<b.x && a.y<b.y || a.x*a.y<b.x*b.y)
return 0;
else
return 1;
}
int main()
{
int n,m;
int i,j,xx,yy,zz,temp,count=1,max;
while(scanf("%d",&n),n)
{
i=0;
m=n;
while(m--)
{
scanf("%d%d%d",&xx,&yy,&zz);
jm[i].x=xx;
jm[i].y=yy;
jm[i].z=zz;
if(jm[i].x>jm[i].y)
{
temp=jm[i].x;
jm[i].x=jm[i].y;
jm[i].y=temp;
}
i++;
jm[i].x=yy;
jm[i].y=zz;
jm[i].z=xx;
if(jm[i].x>jm[i].y)
{
temp=jm[i].x;
jm[i].x=jm[i].y;
jm[i].y=temp;
}
i++;
jm[i].x=xx;
jm[i].y=zz;
jm[i].z=yy;
if(jm[i].x>jm[i].y)
{
temp=jm[i].x;
jm[i].x=jm[i].y;
jm[i].y=temp;
}
i++;
}
n*=3;
sort(jm,jm+n,cmp);
for(i=0;i<n;i++)//dp最长子序列之和问题了
{
dp[i]=jm[i].z;
}
for(i=0;i<n;i++)
{
max=dp[i];
for(j=0;j<i;j++)
{
if(jm[i].x<jm[j].x&&jm[i].y<jm[j].y)
{
if(max<dp[j]+jm[i].z)
max=dp[j]+jm[i].z;
}
}
dp[i]=max;
}
max=0;
for(i=0;i<n;i++)
{
if(max<dp[i])
max=dp[i];
}
printf("Case %d: maximum height = %d\n",count++,max);
}
return 0;
}
起初用的是qsort()排的序,不知道哪里出问题了,还是南柯提醒我用sort()的,但是关键是我现在还是不知道qsort()怎么用(用的只是一些关于它的基础,最简单的,一复杂就不会用了),救命啊~~~