HDU 1069 Monkey and Banana 解题报告

纵饮孤独 提交于 2020-01-26 09:47:40

HDU 1069 Monkey and Banana 解题报告

基础dp题,开始我题目还看错了,以为每种立方体只能用1次。。。其实可以无限使用
解题思路:每种立方体可以摆成3种形式,全部做成结构,排个序,求最大高度就行

#include<iostream>
#include<math.h>
#include<iomanip>
#include<algorithm>
#include<queue>
#include<cstring>
#include<string>
#include<map>
#include<stack>
#include<stdio.h>
#include<cstdio>
#include<stdlib.h>
#include<fstream>
#include<iomanip>
#pragma warning(disable:4996)
#define INF 0x3f3f3f3f
#define ll long long
#define PI acos(-1.0)
const int N = 1000010;
using namespace std;
struct block {
	int x, y, z;
}a[100];//6个面分别做底,有6种情况,但是长宽可以比大小,这样只有3种了,石头数最大为30,所以开100个够用了
int dp[100];
bool cmp(block b1, block b2)//从小到大排序
{
	if (b1.x == b2.x)//先比较长度,如果一样就比较宽度,小的排前面
		return b1.y < b2.y;
	return b1.x < b2.x;
}
int main()
{
	int n, cnt = 0;
	while (scanf("%d", &n) != EOF)
	{
		if (n == 0)
			return 0;
		cnt++;
		int xx, yy, zz;
		int c = 0;
		for (int i = 0; i < n; i++)
		{
			scanf("%d%d%d", &xx, &yy, &zz);
			a[c].z = xx;
			a[c].x = yy > zz ? yy : zz;
			a[c].y = yy > zz ? zz : yy;
			c++;
			a[c].z = yy;
			a[c].x = xx > zz ? xx : zz;
			a[c].y = xx > zz ? zz : xx;
			c++;
			a[c].z = zz;
			a[c].x = yy > xx ? yy : xx;
			a[c].y = yy > xx ? xx : yy;
			c++;
		}
		sort(a, a + c, cmp);
		int maxx = 0;
		dp[0] = a[0].z;//注意初始化
		for (int i = 1; i < c; i++)
		{
			maxx = 0;
			for (int j = 0; j < i; j++)
			{
				if(a[j].x<a[i].x&& a[j].y< a[i].y)//如果当前j位置满足条件,就比较maxx和dp[j]的大小,dp[j]代表到j位置时的高度最大值,在循环中,maxx不停更新
					maxx = maxx > dp[j] ? maxx : dp[j];
			}
			dp[i] = a[i].z + maxx;
		}
		int ans=0;
		for (int i = 0; i < c; i++)//循环一次找出最大值
		{
			ans = max(dp[i], ans);
		}
		printf("Case %d: maximum height = %d\n", cnt, ans);
	}

}

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!