HDU 1069 基础动态规划+排序

时间:2020-12-05 22:08:02

题意 给出n种立方体石头 当且仅当一块石头的底部宽度长度都小于一块石头的时候才能放在上面 问最高能放多高?石头不限数目

然而同样一种石头采用同样的摆放方式 两快相同石头一定无法进行放置 所以 一块石头的一种摆放方式最多使用一次

进行一下排序 让长与宽最小的放在最前面 然后就是可爱的dp模板了

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<math.h>
using namespace std;
struct node
{
int a,b,c;
};
node q[50000];
int dp[50000];
int cmp(node z,node x)
{
if(z.b==x.b)
return z.a>x.a;
else return z.b>x.b;
}
int main(){
int n;
int tt=1;
while(~scanf("%d",&n))
{
if(n==0)
break;
int w=0;
for(int i=0;i<n;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
q[w].a=x;
q[w].b=y;
q[w++].c=z;
q[w].a=y;
q[w].b=x;
q[w++].c=z;
q[w].a=y;
q[w].b=z;
q[w++].c=x;
q[w].a=z;
q[w].b=y;
q[w++].c=x;
q[w].a=x;
q[w].b=z;
q[w++].c=y;
q[w].a=z;
q[w].b=x;
q[w++].c=y;
}
sort(q,q+w,cmp);
dp[0]=q[0].c;
for(int i=1;i<w;i++)
{
int minn=0;
for(int k=0;k<i;k++)
{
if(q[k].a>q[i].a&&q[k].b>q[i].b)
{
if(dp[k]>minn)
{
minn=dp[k];
}
}
}
dp[i]=q[i].c+minn;
}
int ans=0;
for(int i=0;i<w;i++)
{
if(dp[i]>ans)
{
ans=dp[i];
}
}
printf("Case %d: maximum height = %d\n",tt++,ans);
}
}