hdu1069

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

class Data
{
public:
int S, Height;
int upl, uph;
};

Data Da[100];
int n;
int dp[100];

int cmp(const Data &a, const Data &b) //按照面积最大或高度最高排序
{
if(a.S != b.S)
return a.S > b.S;
else
return a.Height > b.Height;
}

int main()
{
// freopen("data.txt", "r", stdin);
int i, j, k, Case = 1;
int a, b, c;
while(cin >> n && n)
{
k = 0;
memset(dp, 0, sizeof(dp));
for(i = 0; i < n; i++) //计算每一个面的面积,以及顶面的长宽以及高度
{
cin >> a >> b >> c;
Da[k].S = a * b; Da[k].upl = a > b ? a : b; Da[k].uph = a > b ? b : a;
Da[k++].Height = c;
Da[k].S = a * c; Da[k].upl = a > c ? a : c; Da[k].uph = a > c ? c : a;
Da[k++].Height = b;
Da[k].S = b * c; Da[k].upl = b > c ? b : c; Da[k].uph = b > c ? c : b;
Da[k++].Height = a;
}
sort(Da, Da + k, cmp); //排序
int ans = 0;
for(i = 0; i < k; i++) //动态规划
{
dp[i] = Da[i].Height;
for(j = 0; j < i; j++)
{
if(Da[i].S < Da[j].S && Da[i].upl < Da[j].upl && Da[i].uph < Da[j].uph) //判断是否符合
{
dp[i] = dp[i] > dp[j] + Da[i].Height ? dp[i] : dp[j] + Da[i].Height;
}
}
if(ans < dp[i]) //最大高度
ans = dp[i];
}
cout << "Case " << Case++ << ": maximum height = " << ans << endl;
}
return 0;
}

时间: 2024-10-23 14:10:29

hdu1069的相关文章

HDU1069(最长单调递减数列)

告诉你n种规模的长方体的长,宽,高,每种规模的长方体个数不限,问你最多能搭多高的塔,塔是由这些长方体搭的,自上而下,每一块长方体都要比在它下面的长方体的规模小,即长和宽都比下面的长方体要小.注意长方体是可以调整的. 就是按照长和宽来排序,找最长的单调递减的数列.我们用dp[i]来表示搭建到第i块长方体的时候塔的最高高度,那么状态转移方程就是dp[i]=max(dp[i],dp[j]+s[i].h): #include <stdio.h> #include <string.h> #i

hdu1069 简单dp

题意是给你n个长方体的箱子的长 宽 高   一个长方体能放在另一个上的条件的长和宽都必须比那个小     每个箱子可以用多次       求最高的高度 先按边排序 每个箱子有三种形态       每种形态肯定只能用到一次   所以可以理解为3*n个箱子  每个箱子只能用一次 dp[i]表示用第i个箱子能到的最大高度 用两层for循环找     外层i,里面j表示箱子i能不能放在箱子j上如果能放则判断更新    dp[i] #include<stdio.h> #include<string

HDU1069 Monkey and Banana 简单dp

题意: 把给定的长方体(不限)叠加在一起,叠加的条件是,上面一个长方体的长和宽都比下面长方体的长和宽短: 求这些长方体能叠加的最高的高度.(其中(3,2,1)可以摆放成(3,1,2).(2,1,3)等). /* *********************************************** Author :devil Created Time :2015/12/7 20:38:42 ************************************************

HDU1069 Monkey and Banana 【DP】

Monkey and Banana Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 7816    Accepted Submission(s): 4028 Problem Description A group of researchers are designing an experiment to test the IQ of a

HDU1069(未完成)

#include <iostream> #include <cstdio> #include <algorithm> using namespace std; struct rectangle { int x,y,z; }w[100]; int dp[100]; bool cmp(rectangle x1,rectangle x2) { if(x1.x>x1.y) return true; if(x1.x==x2.x&&x1.y>x2.y)

最大子序列变形——二维带权值 O(n*n) HDU1069

#include <cstring> #include <iostream> #include <algorithm> using namespace std; int tmp[30][3]; int dp[100]; class Node { public: int x; int y; int h; bool operator <(const Node&n) const { if(x==n.x) return y<n.y; else return

ACM-经典DP之Monkey and Banana——hdu1069

***************************************转载请注明出处:http://blog.csdn.net/lttree*************************************** Monkey and Banana Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 6984    Accep

hdu1069 dp

题意:有若干种不同规格(长.宽.高)的砖块,每种砖块有无数个,可以自由选择以砖块的哪条边做长.宽或高,用这些砖块搭高塔,要求上面砖块的长宽必须严格小于下面砖块的长宽,问塔最高能有多高 我的做法是每读入一组长宽高,就把它分为三种不同的.长宽高定好的砖块,全部读完之后将这些砖块依次按照长宽高排序,从长宽最大的砖块开始依次求以该砖块为顶的塔最高能有多高: 对于第 i 块砖,我想前寻找第一块长宽均比它大的砖块 j ,进行优化: dp [ i ] = max ( dp [ i ] , dp [ j ] +

[HDU1069]Monkey and Banana

题目大意:给你$n$种长方体,要你用这些长方体从下往上叠起来,下面的长方体的长和宽要严格大于上面的.求出最高能搭多高. 思路:先得出可以使用的长方体(长>宽,注意高也可以作为一条长或宽,那么一个长方体至少有3种不同的长宽高),然后根据长排序,接着DP就行了. 具体见代码. C++ Code: #include<cstdio> #include<algorithm> #include<cstring> using namespace std; struct cft{