您的位置:首页 > 其它

HDU 1069 Monkey and Banana

2012-02-04 09:09 337 查看
题目链接: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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  测试