您的位置:首页 > 其它

HDU 1069 Monkey and Banana(最长递减子序列)

2017-12-12 19:36 316 查看
题目链接

题意:摞长方体,给定长方体的长宽高,个数无限制,可随意翻转,要求下面的长方体的长和宽都大于上面的,都不能相等,问最多能摞多高。

题解:个数无限,其实每种形态最多就用一次,把每种形态都单独算一种,同时保证长比宽大,按dp做即可。注意要从小到大摞,从大到小是不对的。

#include <bits/stdc++.h>
using namespace std;
struct sa
{
int l,w,h;
}data[1005];
int dp[1005],n,d[5];
bool cmp(sa x,sa y)
{
if(x.l==y.l) return x.w<y.w;
return x.l<y.l;
}
int main()
{
int t=1;
while(scanf("%d",&n)&&n)
{
int cnt=0;
for(int i=0;i<n;i++)
{
scanf("%d%d%d",&d[0],&d[1],&d[2]);
sort(d,d+3);
data[cnt].l=d[1],data[cnt].w=d[0],data[cnt].h=d[2],cnt++;
data[cnt].l=d[2],data[cnt].w=d[0],data[cnt].h=d[1],cnt++;
data[cnt].l=d[2],data[cnt].w=d[1],data[cnt].h=d[0],cnt++;
}
sort(data,data+cnt,cmp);
for(int i=0;i<cnt;i++)
dp[i]=data[i].h;
for(int i=1;i<cnt;i++)
for(int j=0;j<i;j++)
{
if(data[j].l<data[i].l&&data[j].w<data[i].w)
{
if(dp[i]<dp[j]+data[i].h)//双层for更直观
dp[i]=dp[j]+data[i].h;
}
}
int ans=dp[0];
for(int i=1;i<cnt;i++)
ans=max(ans,dp[i]);
printf("Case %d: maximum height = %d\n",t++,ans);
}
return 0;
}


传送门:http://blog.csdn.net/qinmusiyan/article/details/7986263
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: