您的位置:首页 > 其它

hdu/hdoj 1069 Monkey and Banana

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

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

#include <iostream>
#include <algorithm>
using namespace std;

typedef struct Block{
int l; // 长
int w; // 宽
int h; // 高
}Block;
int dp[110];// 当前最长长度
int n;
Block nBlocks[100];
int cnt = 0;

// 按升序排列
bool cmp(Block m, Block n)
{
return (m.l*m.w < n.l*n.w);
}

// 如果n放m上面
bool is(Block m, Block n)
{
return (m.l>n.l && m.w>n.w) || (m.l>n.w && m.w>n.l);
}

int main()
{

int a, b, c;
int temp;
while(scanf("%d", &n) && n)
{
++cnt;
for(int i=0; i<3*n; ++i)
{
scanf("%d %d %d", &a, &b, &c);
//cout << a << " " << b << " " << c << endl;
nBlocks[i].l=a, nBlocks[i].w=b, nBlocks[i].h=c, ++i;
nBlocks[i].l=b, nBlocks[i].w=c, nBlocks[i].h=a, ++i;
nBlocks[i].l=c, nBlocks[i].w=a, nBlocks[i].h=b;
}

sort(nBlocks, nBlocks+3*n, cmp);
for (int i=0; i<3*n; ++i)//注意初始化
dp[i]= nBlocks[i].h;

for(int i=1; i<3*n; ++i)
{
for(int j=0; j<i; ++j)
{
if(is(nBlocks[i], nBlocks[j]))
dp[i] =max(dp[j]+nBlocks[i].h,dp[i]);
}

}
temp = 0;
for(int i=0; i<3*n; ++i)
{
if(dp[i] > temp)
temp = dp[i];
}
printf("Case %d: maximum height = %d\n", cnt, temp);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hdu 1069 dp