hdu 1069 Monkey and Banana(动态规划)

连续两天没睡好,上午写代码时脑子跟团浆糊一样。中午去补了一觉,神清气爽。

这道题算是比较难的吧。每一个箱子都可以产生三组数据,对这些数据按面积从大到小排序。

数据处理的时候,如果一个箱子之前所有的箱子都没办法放在这个箱子下面,那就以这个箱子为底,生成一组数据。受习惯的影响, 刚开始我直接把之前最大的数据当成ans[i]的值。。。

最后需要从所有ans中选出最大的,还是受习惯的影响,第一遍的时候,我直接就把ans[j-1]当成最大数据输出了。测试倒是通过了,提交之后WA。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct node
{
	int a,b;
	int h,s;
}mark[105],temp[105];
int cmp(const void *a,const void *b)
{
	return (*(node *)b).s-(*(node *)a).s;
}
int main()
{
	int n,count;
	int x,y,z;
	int i,j,k;
	int ans[105],t;
	int sum;
	count=0;
	while(scanf("%d",&n),n)
	{
		count++;
		j=0;
		for(i=0;i<n;i++)
		{
			scanf("%d%d%d",&x,&y,&z);
			mark[j].a=x; mark[j].b=y; mark[j].h=z; mark[j].s=x*y; j++;
			mark[j].a=x; mark[j].b=z; mark[j].h=y; mark[j].s=x*z; j++;
			mark[j].a=z; mark[j].b=y; mark[j].h=x; mark[j].s=y*z; j++;
		}//每一组a,b,c都会生成三组数据。
		
		qsort(mark,j,sizeof(mark[0]),cmp);//将数据按照面积排列。
		
		memset(ans,0,sizeof(ans));
		ans[0]=mark[0].h;
		temp[0].a=mark[0].a;
		temp[0].b=mark[0].b;
		temp[0].s=mark[0].s;
		for(i=1;i<j;i++)
		{
			ans[i]=mark[i].h;
			temp[i].a=mark[i].a;
			temp[i].b=mark[i].b;
			temp[i].s=mark[i].s;//如果修改一下的话,这个temp应该是可以去掉的。temp记录的是最上面的箱子的数据。
			for(k=0;k<i;k++)
			{
				if(temp[k].s>temp[i].s&&(temp[k].a>mark[i].a&&temp[k].b>mark[i].b||temp[k].b>mark[i].a&&temp[k].a>mark[i].b))
				{
					t=ans[k]+mark[i].h;
					if(t>ans[i])
						ans[i]=t;		
				}
			}
		}
		sum=0;
		for(i=0;i<j;i++)
			if(ans[i]>sum)
				sum=ans[i];//找出最大的值
		
		printf("Case %d: maximum height = %d\n",count,sum);
	}
	return 0;
}










  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值