hdu1069

/*
分析:
    每种石头有三种方法,那么等效为:有3*n种石头,每种朝上
的面是固定的。
    根据x和y排序(要保证相应的x、y总有x>=y),然后dp[i]=
max{h[i],h[i]+dp[j]}(j<i,且石块i放于石块j上,符合题意)。


    这题做的真艰难,还是俄太菜了0.0,继续努力吧。


                                             2012-04-19
*/






#include"stdio.h"
#include"stdlib.h"
struct A
{
	int x;
	int y;
	int h;
}each[100];
int cmp(const struct A *a,const struct A *b)
{
	if(a->x!=b->x)
		return b->x-a->x;
	else
		return b->y-a->y;
}
int main()
{
	int n;
	int i,l;
	int k;
	int x,y,z;
	int dp[100];
	int max;
	int Case=1;
	while(scanf("%d",&n),n)
	{
		k=0;
		for(i=0;i<n;i++)
		{
			scanf("%d%d%d",&x,&y,&z);
			each[k].x=x>y?x:y;
			each[k].y=x>y?y:x;
			each[k].h=z;
			k++;
			each[k].x=x>z?x:z;
			each[k].y=x>z?z:x;
			each[k].h=y;
			k++;
			each[k].x=z>y?z:y;
			each[k].y=z>y?y:z;
			each[k].h=x;
			k++;
		}
		qsort(each,k,sizeof(each[0]),cmp);


		dp[0]=each[0].h;
		for(i=1;i<k;i++)
		{
			max=0;
			for(l=i-1;l>=0;l--)	
			{
				if((each[l].y>each[i].y&&each[l].x>each[i].x)||(each[l].y>each[i].x&&each[l].x>each[i].y))
				{
					if(dp[l]>max)
						max=dp[l];
				}
			}


			dp[i]=max+each[i].h;
		}
		max=0;
		for(i=0;i<k;i++)
		{
			if(dp[i]>max)
				max=dp[i];
		}


		printf("Case %d: maximum height = %d\n",Case,max);
		Case++;
	}
	return 0;
}


你可能感兴趣的:(struct,zk,ini,each)