0
点赞
收藏
分享

微信扫一扫

HDU 1069 Monkey and Banana

想溜了的蜗牛 2022-08-04 阅读 89


题目地址:​​点击打开链接​​

思路:先把x排序,只能对x,y种一个变量排序,且必须对一个变量先排序,然后再保证x,y都符合要求的情况下,对高度进行DP,虽然题目说每种砖块可以无限用,但每种砖块最多只能用6次,因为每种砖块有6种摆放方法,并且摆放时要求长和宽严格递减

AC代码:

#include <iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>

using namespace std;

struct blocks
{
int x,y,z;
}kind[200];

int num,dp[200];

void init(int k,int x,int y,int z)
{
kind[k].x = x;
kind[k].y = y;
kind[k].z = z;
//dp[k] = z;要排序完再赋值,不然排序完的kind值和dp值不对应
}

bool cmp(blocks a,blocks b)
{
return a.x > b.x;//只能排一个,因为虽然x很大,y很小会被排到第一个,不符合题意
}

int main()
{
int i,j,n,num,l=1;
int x,y,z,max,max1;
while(cin>>n && n)
{
num = 0;
memset(dp,0,sizeof(dp));
for(i=0; i<n; i++)
{
cin>>x>>y>>z;
init(num++,x,y,z);
init(num++,y,x,z);
init(num++,y,z,x);
init(num++,z,y,x);
init(num++,x,z,y);
init(num++,z,x,y);
}

max1 = dp[0];
sort(kind,kind+num,cmp);
for(i=0; i<num; i++)
{
dp[i] = kind[i].z;
}
for(i=1; i<num; i++)
{
max = 0;
for(j=0; j<i; j++)
{
if(kind[i].y < kind[j].y && kind[i].x < kind[j].x && dp[j]> max)//排序完的结果还有等于的情况,再判断一次
max = dp[j];
}
dp[i] += max;
if(dp[i] > max1)
max1 = dp[i];
}
printf("Case %d: maximum height = %d\n",l++,max1);//记得加\n
}
return 0;
}




举报

相关推荐

0 条评论