您的位置:首页 > 其它

hdu1069 Monkey and Banana

2015-12-16 00:14 381 查看
题意:每个箱子有长宽高,只有满足上面的箱子长和宽都比下面的小,才能放,问能将所有符合条箱子高度拼成最大是,对所有按照长宽排个序,

再是裸地最大子段和。

#include <fstream>
#include <iostream>
#include <string>
#include <complex>
#include <math.h>
#include <set>
#include <vector>
#include <map>
#include <queue>
#include <stdio.h>
#include <stack>
#include <algorithm>
#include <list>
#include <ctime>
#include <memory.h>
#include <ctime>
#include <assert.h>

#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define eps 1e-8
#define M_PI 3.141592653589793

typedef long long ll;
const ll mod=1000000007;
const int inf=99999999;
ll powmod(ll a,ll b) {ll res=1;a%=mod;for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
struct Node
{
int x,y,h;
}node[200];

bool cmp(Node a,Node b)
{
return a.x==b.x ? a.y<b.y : a.x<b.x;
}
int dp[200];
using namespace std;
int main()
{
int n,T=0;
while(cin>>n&&n){
int t=0;
for(int i=0;i<n;i++){
int a,b,c;cin>>a>>b>>c;
node[t].x=a,node[t].y=b,node[t].h=c;
node[t+1].x=a,node[t+1].y=c,node[t+1].h=b;
node[t+2].x=b,node[t+2].y=a,node[t+2].h=c;
node[t+3].x=b,node[t+3].y=c,node[t+3].h=a;
node[t+4].x=c,node[t+4].y=a,node[t+4].h=b;
node[t+5].x=c,node[t+5].y=b,node[t+5].h=a;
t+=6;
}
int res=0;
sort(node,node+t,cmp);
for(int i=0;i<t;i++) dp[i]=node[i].h;
for(int i=1;i<t;i++){
for(int j=0;j<i;j++){
if(node[i].x>node[j].x&&node[i].y>node[j].y)
dp[i]=max(dp[i],dp[j]+node[i].h);
}
}
cout<<"Case "<<++T<<": maximum height = "<<*max_element(dp,dp+t)<<endl;

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  dp