HDU 1069 Monkey and Banana

30 篇文章 0 订阅
11 篇文章 0 订阅

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1069

几天没写博客了,嘿嘿,该总结一下了。如果不是课件上把这题规划到动态规划里面我一直都把它当贪心考虑,汗ing。

题目大意:给你N种箱子,给出它的长,宽,高;(每种箱子视为无限个)。把箱子叠层起来,问最大能叠多高。但要求的必须在上面一个箱子的长和宽都要比它下面的箱子的长和宽都小。

思路:其实就是求最长的单调递减序列。题目上说每种可以有无限个,那么就把N中类型的箱子都列举出来,全部进行比较。在长和宽的递减下,求最大能得出的最大高度了。

代码:

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct banana
{
   int len;//**长**//
   int wid;//**宽**//
   int high; //**高**//
   int dp;//**保存最大高度**//
}w[101];
bool comp(banana a,banana b)//**按长跟宽进行排序**//
{
   if(a.len>b.len) return true;
   if(a.len==b.len&&a.wid>b.wid) return true;
   return false;
}
int main()
{
   int n,i,j,x,y,z,max,count,num=1;
   while(~scanf("%d",&n)&&n)
   {
	  memset(w,0,sizeof(w));
      count=0;
      for(i=0;i<=n-1;i++)
	  {
         scanf("%d %d %d",&x,&y,&z);
         w[count].len=x;w[count].wid=y;w[count].high=z;w[count].dp=z;//**将每种箱子的情况都列举出来**//
		 count++;
		 w[count].len=x;w[count].wid=z;w[count].high=y;w[count].dp=y;
		 count++;
         w[count].len=y;w[count].wid=x;w[count].high=z;w[count].dp=z;
		 count++;
		 w[count].len=y;w[count].wid=z;w[count].high=x;w[count].dp=x;
		 count++;
         w[count].len=z;w[count].wid=x;w[count].high=y;w[count].dp=y;
		 count++;
         w[count].len=z;w[count].wid=y;w[count].high=x;w[count].dp=x;
		 count++;
      }      
	  sort(w,w+count,comp);
	  max=w[0].dp;//**还是跟原来一样,最好不要设为什么0,-1,(吃过几次亏),可以估计出来就求出来**// 
	  for(i=count-2;i>=0;i--)//**跟数塔一样的比较,从后往前进行比较,不过貌似前往后也行**// 
	  {
		  for(j=i+1;j<=count-1;j++)
		  {
			  if(w[i].len>w[j].len&&w[i].wid>w[j].wid)//**保证上面箱子的长和宽都比下面的小**//     
              {
				  if(w[i].dp<w[j].dp+w[i].high)//**经典的求最大递减的DP**//
				  {
					  w[i].dp=w[j].dp+w[i].high;
				  }
			  }
		  }
          if(w[i].dp>max)//**更新最高值**//
          {
			  max=w[i].dp;
		  }
	  }  
	  printf("Case %d: maximum height = %d\n",num++,max);
   }
   return 0;
}                
下面还有一段最开始写的代码,测试数据都对了,但提交就是不对,求大牛指点。。。。。。

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct banana
{
	int len;
	int wid;
	int high;
}w[101];
bool comp(banana a,banana b)
{
	if(a.len>b.len) return true;
	if(a.len==b.len&&a.wid>b.wid) return true;
	return false;
}
int main()
{
	int n,i,j,x,y,z,count,max,ans,num=1,dp[101];
	while(~scanf("%d",&n)&&n)
	{
		memset(w,0,sizeof(w));
		count=0;
		for(i=0;i<=n-1;i++)
		{
			scanf("%d %d %d",&x,&y,&z);
			w[count].len=x;w[count].wid=y;w[count].high=z;
			count++;
			w[count].len=x;w[count].wid=z;w[count].high=y;
			count++;
			w[count].len=y;w[count].wid=x;w[count].high=z;
			count++;
			w[count].len=y;w[count].wid=z;w[count].high=x;
			count++;
			w[count].len=z;w[count].wid=x;w[count].high=y;
			count++;
			w[count].len=z;w[count].wid=y;w[count].high=x;
			count++;
		}
		sort(w,w+count,comp);
		for(i=0;i<=count-1;i++)
		{
			dp[i]=w[i].high;
		}
		max=dp[0];
		for(i=count-2;i>=0;i--)
		{
			for(j=i+1;j<=count-1;j++)
			{
				if(w[i].len>w[j].len&&w[i].wid>w[j].wid)
				{
					if(dp[i]<dp[j]+w[i].high)
					{
						dp[i]=dp[j]+w[i].high;
					}
				}
			}
			if(dp[i]>max)
			{
				max=dp[i];
			}
		}
		printf("Case %d: maximum height = %d\n",num++,max);
	}
	return 0;
}


  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值