HDU 1069 Monkey and Banana(最长递减子序列)
2024-08-31 03:41:15
题意:摞长方体,给定长方体的长宽高,个数无限制,可随意翻转,要求下面的长方体的长和宽都大于上面的,都不能相等,问最多能摞多高。
题解:个数无限,其实每种形态最多就用一次,把每种形态都单独算一种,同时保证长比宽大,按dp做即可。注意要从小到大摞,从大到小是不对的。
#include <bits/stdc++.h>
using namespace std;
struct sa
{
int l,w,h;
}data[];
int dp[],n,d[];
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=;
while(scanf("%d",&n)&&n)
{
int cnt=;
for(int i=;i<n;i++)
{
scanf("%d%d%d",&d[],&d[],&d[]);
sort(d,d+);
data[cnt].l=d[],data[cnt].w=d[],data[cnt].h=d[],cnt++;
data[cnt].l=d[],data[cnt].w=d[],data[cnt].h=d[],cnt++;
data[cnt].l=d[],data[cnt].w=d[],data[cnt].h=d[],cnt++;
}
sort(data,data+cnt,cmp);
for(int i=;i<cnt;i++)
dp[i]=data[i].h;
for(int i=;i<cnt;i++)
for(int j=;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[];
for(int i=;i<cnt;i++)
ans=max(ans,dp[i]);
printf("Case %d: maximum height = %d\n",t++,ans);
}
return ;
}
传送门:http://blog.csdn.net/qinmusiyan/article/details/7986263
最新文章
- IIC驱动移植在linux3.14.78上的实现和在linux2.6.29上实现对比(deep dive)
- Matlab 的reshape函数
- SharePoint\O365 ";See also";功能 and site feature 激活\禁用小节
- DIV相关的操作总结
- QA技能必备
- iOS -动态可变参数
- Lua 第一个应用程序 Hello World
- UIImageView之我的动画为什么停了?UIImageView, highLighted,animationImages
- Asp.net 回车默认按钮
- 聊聊synchronized的锁问题
- + CategoryInfo : NotSpecified: (:) [], PSSecurityException + FullyQualifiedErrorId : RuntimeException
- 团队的Kick off
- double 四舍五入保留一定的位数
- kettle并行运行时出现「Unknown error in KarafBlueprintWatcher」
- spring cloud Ribbon
- canvas简单下雨特效
- 我的DIY作品
- hostapd作为radius服务器
- 磁盘IO过高时的处理办法
- angularJS新增 品优购新增品牌